Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在数据表列表中查找相交的数据行_C#_.net_Linq - Fatal编程技术网

C# 在数据表列表中查找相交的数据行

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 =&

我有一张单子。我想筛选表列表中的所有行,以查找列表中每个datatable中的所有行

如果可能,比较需要位于每行的“ID”列上

我试着和Linq一起解决这个问题,但是被卡住了。这就是我到目前为止所做的:

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的所有行中查找一行的单一出现
要在DataTable上使用Linq,请参阅以获取开始信息

您可以从这样一个表中获取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 ());