将DataRow集合与List <t> </t>进行比较

时间:2010-01-05 11:20:00

标签: c# linq c#-3.0 datatable datarow

我有一个List<string>我有一个DataTable。

DataRow中的一列是ID。列表包含此ID的实例。

DataTable会在Timer上填充。

我想将List中不在DataTable中的项目返回到另一个列表中。

3 个答案:

答案 0 :(得分:13)

你会想要做这样的事情

var tableIds = table.Rows.Cast<DataRow>().Select(row => row["ID"].ToString());

var listIds = new List<string> {"1", "2", "3"};

return listIds.Except(tableIds).ToList();

您可以将数据表中的行转换为IEnumerable集合,然后从每个行中选择“ID”列值。然后,您可以使用Enumerable.Except扩展方法从List中获取不在您刚刚创建的集合中的所有值。

如果您需要获取表中的值而不是列表中的值,只需反转listIds和tableIds。

答案 1 :(得分:1)

如果你的表是这样的:

DataTable dt = new DataTable();
dt.Columns.Add("ID");
DataRow dr = dt.NewRow();
dt.PrimaryKey = new DataColumn[] {dt.Columns[0]};
dr["ID"] = "1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "2";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["ID"] = "3";
dt.Rows.Add(dr);

,列表是这样的:

List<string> ls = new List<string>{"1","2","4"};

我们可以通过这种方式获取列表中找到的项目而不是数据表:

var v = from r in ls
                where !dt.Rows.Contains(r)
                select r;
        v.ToList();

答案 2 :(得分:1)

通过HashSet<T>以合理的效率(并注意到从DataRow获取数据的最快方式是通过DataColumn索引器):

        HashSet<int> ids = new HashSet<int>();
        DataColumn col = table.Columns["ID"];
        foreach (DataRow row in table.Rows)
        {
            ids.Add((int)row[col]);
        }
        var missing = list.Where(item => !ids.Contains(item.ID)).ToList();