【发布时间】:2010-01-05 11:19:59
【问题描述】:
我有一个 List<string> 和一个 DataTable。
DataRow 中的一列是 ID。 List 包含此 ID 的实例。
DataTable 在 Timer 上填充。
我想将列表中不在 DataTable 中的项目返回到另一个列表中。
【问题讨论】:
标签: c# linq c#-3.0 datatable datarow
我有一个 List<string> 和一个 DataTable。
DataRow 中的一列是 ID。 List 包含此 ID 的实例。
DataTable 在 Timer 上填充。
我想将列表中不在 DataTable 中的项目返回到另一个列表中。
【问题讨论】:
标签: c# linq c#-3.0 datatable datarow
你会想做这样的事情
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。
【讨论】:
如果你的桌子是这样的:
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();
【讨论】:
通过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();
【讨论】: