【问题标题】:Loop through DataTable and select only certain values in column循环遍历 DataTable 并仅选择列中的某些值
【发布时间】:2015-08-04 08:43:01
【问题描述】:

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

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

我现在的问题是我只想打印行的“绘图”列中的内容,其中与 ImportData 中的键同名的所有列都具有“X”作为值。目前,我正在获取所有行,其中任何列的值都为“X”,并且与 ImportData 中的任何键具有相同的名称。

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

提前非常感谢。

编辑:

ImportData 包含不同产品的名称作为键。客户是否已通过其他程序选择了这些产品,如果它们已被选中,则值为 true,如果未选中,则值为 false。

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

这适用于 ImportData 中的所有键,最后我应该知道 DataTable 中的哪一行在所有与 ImportData 中的键同名的列中都有一个“X”。对于这一行,我想获取名为“绘图”的列的内容。 因此,例如说 ImportData 包含:

[电机,真][Product6,真][Product7,真]

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

很遗憾,我无法发布图片..

【问题讨论】:

  • 那只检查绘图列,不检查所有列?
  • 我想检查所有列,并且只有与 ImportData 中的所有键同名的所有列都有一个“X”我想打印出绘图列跨度>
  • 请详细解释 ImportData 包含什么,数据表中的内容以及您想要实现的目标。也许添加一个简单但完整的示例,可以编译为控制台应用程序。

标签: c# dictionary datatable


【解决方案1】:

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

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

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

SomeConditionIsMetc 函数看起来像这样:

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'
     }

【讨论】:

  • 是的,也许这是个好主意,我会试试的。如上所述,当我发布它时,我明白我很难准确地描述我想要做什么。希望我能想出一个解决方案。
  • 首先考虑问题,然后考虑解决方案。如果你能清楚地描述问题,解决方案就会自然而然地呈现出来。
  • “我现在的问题是我只想打印出行的“绘图”列中的内容,其中所有与 ImportData 中的键同名的列都具有“X”作为值” .那是我的问题..
  • 我的意思是,我得到了我想要的内容图纸,但现在我得到了所有列名出现在 ImportData 中的图纸,我只想要所有列名的图纸出现在 ImportData 中。
  • 非常感谢!你真的懂我哈哈。真的,谢谢你的回答,这正是我想做的。
【解决方案2】:

试试这个

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多