使用linq根据Id对集合进行分组

本文关键字:集合 linq 根据 Id 使用 | 更新日期: 2023-09-27 17:52:33

我有三个不同的集合,分别命名为Collection1,Collection2,Collection3。现在我想根据它们的Id对它们进行分组并且根据它们的最大数量对Id进行排序。我想要做的第三件事是将该值添加到iccollection中。我的集合如下:

Collection1:
   value1
   Id1
   value2 
   ...
Collection2:
   value1
   Id1
   value2 
   Id2
   ...
Collection3:
   value1
   Id1
   value2 
   Id2
   ... 

注意:Id在集合中是唯一的。collection1或collection2或collection3的Id1可以相同,但集合内的Id不能相同。我所做的如下:

var query = Collection1.Concat.Select(a => a.CountryId).Concat(Collection2.Select(b => b.CountryId).Concat(Collection3.Select(c => c.CountryId).GroupBy(x => x).OrderByDescending(x => x.Count()).ToDictionary(x => x.Key, x => x.Count());

为iccollection变量赋值,我所做的如下:

 foreach (var item in query )
 {
   ICollect.Add(item.Key);
 } 

我不确定是否使用.ToDictionary。有人能提出不同的方法吗?谢谢。

使用linq根据Id对集合进行分组

所以你想合并所有的集合和组的ID?由于id在每个集合中都是唯一的,因此组大小最多可以为3。

var allIDs = Collection1.Select(x => x.ID)
    .Concat(Collection2.Select(x => x.ID))
    .Concat(Collection3.Select(x => x.ID))
    .GroupBy(id => id)
    .OrderByDescending(g => g.Count())
    .Select(g => g.Key);
foreach(var id in allIDs)
    otherCollection.Add(id);

如果您想保留每个ID的计数,您可以使用ToLookup:

var idLookup = Collection1.Select(x => x.ID)
    .Concat(Collection2.Select(x => x.ID))
    .Concat(Collection3.Select(x => x.ID))
    .ToLookup(id => id)
    .OrderByDescending(g => g.Count());
foreach(var g in idLookup)
{
    otherCollection.Add(g.Key);
    // you get the count in this way:
    int count = g.Count();
}