如何使用Linq从匿名IEnumerable集合中选择项目

时间:2016-07-04 04:15:44

标签: c# linq collections ienumerable

我有2个IEnumerable系列,其中包含一个字符和字符数(即s1 {Key =' a' Count =' 5'}和s2 {Key =& #39; a' Count =' 4'})

我想使用Linq查询执行以下操作:

如果该项目在两个集合中,我只希望集合中的项目具有更高的计数,即来自s1的Count = 5

如果该项目只在一个集合中,那么我们使用该项目(不能使用Distinct,因为它说IEnumerable Anonymous不包含Distinct)

如果这些物品都在两个集合中,但它们的数量是相等的,那么我们使用哪一个并不重要。

无法弄清楚这一部分,我很确定一旦我看到解决方案,我就会想要把头撞到墙上......

3 个答案:

答案 0 :(得分:6)

使用Linq扩展功能,您可以执行此操作。

Dictionary<char,int> dic1 = ...;
Dictionary<char,int> dic2 = ...;

var result = dic1.Concat(dic2)
    .GroupBy(g=>g.Key)
    .ToDictionary(x=>x.Key, x=>x.Max(m=>m.Value)) ; 

如果你有两个包含key, count fields/properties的基础类型的集合,那么请尝试使用它。

var result = list1.Concat(list2)
    .GroupBy(g=>g.Key)
    .Select(x=>new                 // Create an object instead if you have one.   
     {
         x.Key, 
         x=>x.Max(m=>m.Count) 
     }; 

选中此Demo

答案 1 :(得分:3)

您可以按Key进行分组,然后选择最高Count

var collection1 = "testtt".GroupBy(c => c).Select(g => new { Key = g.Key, Count = g.Count() });
var collection2 = "teessst".GroupBy(c => c).Select(g => new { Key = g.Key, Count = g.Count() });

var result = collection1.Concat(collection2)
    .GroupBy(item => item.Key, item => item.Count)
    .Select(g => new { Key = g.Key, Count = g.Max() });

答案 2 :(得分:2)

我认为这是相当直接的:

var s1 = new [] { new { Key = 'a', Count = 5 }, new { Key = 'b', Count = 2 } };
var s2 = new [] { new { Key = 'a', Count = 4 }, new { Key = 'c', Count = 7 } };

var result =
    s1
        .Concat(s2)
        .OrderByDescending(x => x.Count)
        .GroupBy(x => x.Key)
        .SelectMany(x => x.Take(1));

它给了我:

result