C# 在数据表列表中查找相交的数据行
我有一张单子。我想筛选表列表中的所有行,以查找列表中每个datatable中的所有行 如果可能,比较需要位于每行的“ID”列上 我试着和Linq一起解决这个问题,但是被卡住了。这就是我到目前为止所做的:C# 在数据表列表中查找相交的数据行,c#,.net,linq,C#,.net,Linq,我有一张单子。我想筛选表列表中的所有行,以查找列表中每个datatable中的所有行 如果可能,比较需要位于每行的“ID”列上 我试着和Linq一起解决这个问题,但是被卡住了。这就是我到目前为止所做的: List<DataTable> dataTables = new List<DataTable>(); // fill up the list List<DataRow> dataRows = dataTables.SelectMany(dt =&
List<DataTable> dataTables = new List<DataTable>();
// fill up the list
List<DataRow> dataRows =
dataTables.SelectMany(dt => dt.Rows.Cast<DataRow>().AsEnumerable()).
Aggregate((r1, r2) => r1.Intersect(r2));
List dataTables=new List();
//填写清单
列表数据行=
dataTables.SelectMany(dt=>dt.Rows.Cast().AsEnumerable())。
聚合((r1,r2)=>r1.相交(r2));
有什么建议吗 尝试此操作以找到两个列表之间的交集:
r1.Join(r2, r1 => r1.Id, r2 => r2.Id, (r1, r2) => r1);
这不是一个简单的问题。这里有一个解决方案(对我来说似乎太复杂了,但它是有效的)
- 使用Linq to数据集从每行获取Id值
- 将多个列表相交以查找所有公共值
- 在具有一个匹配ID的所有行中查找一行的单一出现
var ids = dt.AsEnumerable().Select (d => d.Field<int>("ID")).OfType<int>();
现在,展平数据表中的所有行,并按公共ID进行筛选:
var rows = dataTables.SelectMany (t => t.AsEnumerable()).Where(
r => commonIds.Contains(r.Field<int>("ID")));
var rows=dataTables.SelectMany(t=>t.AsEnumerable())。其中(
r=>commonId.Contains(r.Field(“ID”));
现在按id分组并获取每行的第一个实例:
var result = rows.GroupBy (r => r.Field<int>("ID")).Select (r => r.First ());
var result=rows.GroupBy(r=>r.Field(“ID”))。选择(r=>r.First());
过去,每当我使用Intersect时,如果不成功,那完全是因为相等比较——处理基本类型的可枚举项通常很好,但在比较方面,我总是不得不覆盖复杂类型。如果你还没有做过,那就值得调查一下
var commonIds = setsOfIds.InsersectAll();
var rows = dataTables.SelectMany (t => t.AsEnumerable()).Where(
r => commonIds.Contains(r.Field<int>("ID")));
var result = rows.GroupBy (r => r.Field<int>("ID")).Select (r => r.First ());