2016-07-04 15 views
1

Ich habe 2 IEnumerable Collections, die ein Zeichen und die Anzahl der Zeichen enthalten (dh s1 {Key = 'a' Count = '5'} und s2 {Key = ‚a‘ Count = ‚4‘})Verwenden von Linq zum Auswählen von Elementen aus einer anonymen IEnumerable-Sammlung

ich folgend mit einer Linq-Abfrage zu tun:

, wenn das Element ist in beiden Sammlungen, ich will nur das Element aus der Sammlung mit der höheren Zahl, dh Count = 5 von s1

Wenn das Element nur in einer Sammlung ist, dann verwenden wir dieses Element (Distinct kann nicht verwendet werden, da es besagt, dass IEnumerable Anonymous Distinct nicht enthält)

Wenn sich die Elemente in beiden Sammlungen befinden, ihre Anzahl jedoch gleich ist, spielt es keine Rolle, welche wir verwenden.

kann diesen Teil nicht herausfinden, ich bin ziemlich sicher, dass, wenn ich die Lösung, die ich sehe eine Wand werde möchte meinen Kopf schlagen in ...

+0

Bitte geben Sie den Beispielcode ein, den Sie ausprobiert haben. –

+0

items.GroupBy (a => a.Key) .Wählen Sie (gr => new {Key = a.Key, Count = gr.Max (aa => aa.Count))}) – omikad

Antwort

3

Sie Gruppe von Key können und wählen Sie max 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

Mit Linq Erweiterungsfunktionen können Sie dies tun.

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)) ; 

Im Fall, wenn Sie zwei Sammlungen von denen die zugrunde liegenden Typ key, countfields/properties enthält, dann versuchen Sie diese verwenden.

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) 
    }; 

prüfen diese Demo

+1

Warum Wörterbücher verwenden? Das OP scheint nicht zu sein. – Enigmativity

2

Ich denke, das die ziemlich einfach ist:

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)); 

Es gibt mir :

result

+0

Kannst du deine Downvote entfernen, wenn du mit meinem Update zufrieden bist? –