循环遍历DataTable并只选择column中的某些值

本文关键字:column 选择 遍历 DataTable 循环 | 更新日期: 2023-09-27 18:06:27

我有一个DataTable从中我想循环通过每一行和列,然后选择一个值从一个特定的列取决于在列/每一行的其他值。

我的代码现在看起来像这样:

 foreach (DataRow drow in dt.Rows)
 {
     foreach (DataColumn dcol in dt.Columns)
     {
         foreach (var Item in ImportData)
         {
             if (Item.Value.Equals(true))
             {
                 if (Item.Key.Equals("" + dcol))
                 {
                     string value = drow[dcol].ToString();
                     if (value.Equals("X"))
                     {
                         outDraws += drow["Drawing"].ToString();
                         outDraws += "'n";
                     }
                 }
             }
         }
     }
}

ImportData是一个Dictionary<string, bool>,它包含我想与我的数据表进行比较的数据。

string outDraws只是一个字符串,它应该包含我想打印出来的图纸的内容。

我现在的问题是,我只想打印出行'Drawing'列的内容,其中所有与ImportData中的键同名的列都具有'X'作为值。目前,我得到所有的行,其中任何列有"X"作为值,并具有相同的名称在ImportData中的任何键。

我知道这对你来说很难得到我想做的,但如果你需要更多的信息,请问我,我会尽量提供。

提前感谢。

编辑:

ImportData包含不同产品的名称作为键。这些产品要么被客户通过另一个程序选中,要么没有被客户选中,如果被选中,则值为true,如果没有被选中,则值为false。

使用上面提供的方法,我想将所有值为true的键与DataTable中的列名进行比较。如果列名对应于ImportData中的键(这是产品的名称),那么我想检查特定行中该列的值是否为'X'。

这适用于ImportData中的所有键,最后我应该知道DataTable中的哪一行在所有列中具有与ImportData中的键同名的"X"。对于这一行,我想获得名为"Drawing"的列的内容。例如,ImportData包含:

[Motor, true][Product6, true][Product7, true]

然后我要打印出第6行的Drawing列。

遗憾的是我不能上传图片

循环遍历DataTable并只选择column中的某些值

和处理任何问题一样:分而治之。把你的问题分解成更小的部分,然后从那里开始。

据我所知,您想对数据表中的某些行做一些事情。比如:

 foreach (var drow in dt.Rows.OfType<DataRow>())
 {
     if (SomeConditionIsMet(dt, drow, ImportData))
     {
         outDraws += drow["Drawing"].ToString();
         outDraws += "'n";
     }
 }

函数SomeConditionIsMetcould看起来像这样:

private static bool SomeConditionIsMet(
                         DataTable dt, DataRow drow, 
                         IDictionary<string, bool> importData)
{
   // TODO if the condition is met, return true
   // otherwise, return false
}

现在你的问题被简化为思考"满足某些条件"意味着什么。一旦你可以清楚地用文字表达,重命名函数以反映这一点(例如为'AllColumnsAreChecked')

以下是我所理解的解决方案:

internal class Program
{
    private static void Main(string[] args)
    {
        var importData = new Dictionary<string, bool>()
        {
            {"Product1", true},
            {"Product2", false},
            {"Product3", true},
        };
        var dt = new DataTable();
        dt.Columns.Add("Product1");
        dt.Columns.Add("Product2");
        dt.Columns.Add("Product3");
        dt.Columns.Add("Product4");
        dt.Columns.Add("Drawing");
        // row1 should be added
        var row1 = dt.NewRow();
        row1["Product1"] = "X";
        row1["Product3"] = "X";
        row1["Drawing"] = "Drawing1";
        dt.Rows.Add(row1);
        // row2 should not be added
        var row2 = dt.NewRow();
        row2["Product1"] = "X";
        row2["Drawing"] = "Drawing2";
        dt.Rows.Add(row2);
        string outDraws = string.Empty;
        foreach (DataRow drow in dt.Rows.OfType<DataRow>())
        {
            if (AllColumnsAreChecked(drow, importData))
            {
                outDraws += drow["Drawing"].ToString();
                outDraws += "'n";
            }
        }
        Console.WriteLine(outDraws);
    }
    private static bool AllColumnsAreChecked(DataRow drow, Dictionary<string, bool> importData)
    {
        foreach (var key in importData.Keys)
        {
            if (!importData[key])
                continue;
            var value = drow[key] as string;
            if (value != "X")
                return false;
        }
    }
}
这是一个基于LINQ的检查实现:
    private static bool AllColumnsAreChecked(DataRow drow, Dictionary<string, bool> importData)
    {
        return importData.Keys
            .Where(k => importData.ContainsKey(k) && importData[k]) // the field must be enabled in importData
            .All(k => (drow[k] as string) == "X"); // the corresponding value in the row must be 'X'
     }

试试这个

DataTable tbl = new DataTable();
foreach (DataRow row in tbl.Rows)
{
    object cellData = row["colName"];
}