我有一个 List<string>
和一个 DataTable。
DataRow 中的一列是 ID。List 包含这些 ID 的实例。
DataTable 在计时器上被填充。
我想要从 List 返回不在 DataTable 中的项到另一个列表中。
你需要做类似这样的事情
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扩展方法获取在刚刚创建的集合中不存在于列表中的所有值。
如果您需要获取表中存在但不在列表中的值,只需反转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();