循环遍历 DataTable 和 select 仅列中的某些值

Loop through DataTable and select only certain values in column

我有一个数据表,我想从中遍历每一行和每一列,然后根据 columns/each 行中的其他值 select 来自特定列的值。

我的代码目前是这样的:

 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>,它包含我要与我的 DataTable 进行比较的数据。

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

我现在的问题是,我只想打印出与 ImportData 中的键同名的所有列的值为 'X' 的行的 'Drawing' 列中的内容。目前,我正在获取任何列的值都为 'X' 并且与 ImportData 中的任何键同名的所有行。

我知道你很难得到我想做的事情,但请询问你是否需要更多信息,我会尽力提供。

非常感谢。

编辑:

ImportData 包含不同产品的名称作为键。这些产品已被客户通过另一个程序 selected 或未被 selected,如果它们已被 selected,则其值为 true,如果未被 selected,则其值为 false。

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

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

[电机,正确][Product6,正确][Product7,正确]

然后我想打印出第 6 行的绘图列。

可惜我不能post图片..

试试这个

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

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

据我了解,您想对数据表中的某些行执行某些操作。类似于:

 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
}

现在您的问题已简化为思考 'Some condition is met' 的含义。一旦你可以用文字清楚地表达出来,重命名函数以反映这一点(例如 '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'
     }