2016-07-04 115 views
1

我有2个包含字符和字符数的IEnumerable集合(即s1 {Key ='a'Count ='5'}和s2 {Key =“A”数=“4”})如何使用Linq从匿名IEnumerable集合中选择项目

我想要做的LINQ查询以下内容:

,如果该项目是在两个集合,我只想从集合具有较高计数的项目,即从s1计数= 5

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

如果项目在两个集合中,但它们的计数相等,则使用哪一个并不重要。

不知道这部分出来,我敢肯定,一旦我看到的解决办法,我会想我的头撞到墙上......

+0

请发布您尝试过的示例代码。 –

+0

items.GroupBy(a => a.Key).Select(gr => new {Key = a.Key,Count = gr.Max(aa => aa.Count))}) – omikad

回答

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() }); 
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, countfields/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

为什么要使用字典? OP似乎不是。 – Enigmativity

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

+0

如果您对我的更新满意,您可以删除您的投票吗? –