2016-06-10 4 views
0

Ich habe zwei Listenobjekte wieWie bekomme ich Unique-Objekte aus zwei Listen in C#?

list1 =[{"id":"101","name":"one"},{"id":"102","name":"two"},{"id":"103","name":"three"}] 
list2 =[{"id":"111","name":"one"},{"id":"112","name":"two"},{"id":"114","name":"four"},{"id":"115","name":"five"}] 

In den obigen zwei Listen enthält doppelte Namen Werte. Jetzt möchte ich die einzigartigen Namensobjekte basierend auf dem Attribut name erhalten. OutPut: -

result =[{"id":"103","name":"three"},{"id":"114","name":"four"},{"id":"115","name":"five"}] 
+1

Sie zeigen JSON-Syntax, haben aber Ihre Frage C# markiert. Können Sie näher erläutern, ob es sich um C# - oder JSON-Listen handelt und was Sie versucht haben, dies zu beheben? – CodeCaster

+0

Sie könnten die 2 Listen verketten, dann 'GroupBy (x => x.name)' und die Werte mit 'Count == 1' erhalten, obwohl wenn Ihr Objekt einen 'IEqualityComparer' hat, gibt es andere Alternativen wie die Kombination ' .Except() 'und' .Union() ' –

Antwort

1

Sie könnten Linq Erweiterungsfunktionen verwenden und dies zu tun.

var result = list1.Concat(list2) 
    .GroupBy(x=>x.name) 
    .Where(x=>x.Count() == 1) 
    .Select(x=>x.FirstOrDefault()) 
    .ToList();  
+0

Vielen Dank @Hari Prasad. Es funktioniert gut –

0
var common = list1.Select(a => a.name).Intersect(list2.Select(b => b.name)); 
+0

Dies wählt nur die Eigenschaft name (OP will das Objekt) –

0

Angenommen, Sie Liste der Modell nach JSON Deserialisierung haben:

var list1 = new List<Model>(); 
var list2 = new List<Model>(); 

Da Sie alle Elemente entfernen müssen, die in jeder Liste schneiden und einzigartige Elemente zurückgibt, verwenden entweder Außer oder RemoveAll:

var target = list1.Except(list2); 

// or use: 
var target = list1.RemoveAll(item => list2.Contains(item)); 

Eine weitere Möglichkeit, mit HashSet:

var hashSet = new HashSet<Model>(list2); 
list1.RemoveAll(item => hashSet.Contains(item)); 

Referenz: Remove elements from one List<T> that are found in another

Verwandte Themen