我有一个List<string>
我有一个DataTable。
DataRow中的一列是ID。列表包含此ID的实例。
DataTable会在Timer上填充。
我想将List中不在DataTable中的项目返回到另一个列表中。
答案 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();