2010-11-01 10 views
25

Ich lerne zu schreiben lambda expressions, und ich brauche Hilfe zum Entfernen aller Elemente aus einer Liste, die nicht in einer anderen Liste sind.Entfernen Sie Elemente aus der Liste 1 nicht in der Liste 2

var list = new List<int> {1, 2, 2, 4, 5}; 
var list2 = new List<int> { 4, 5 }; 

// Remove all list items not in List2 
// new List Should contain {4,5}  
// The lambda expression is the Predicate. 
list.RemoveAll(item => item. /*solution expression here*/); 

// Display results. 
foreach (int i in list) 
{ 
    Console.WriteLine(i); 
} 

Antwort

49

Sie können über RemoveAll tun dies mit Inhalt:

list.RemoveAll(item => !list2.Contains(item)); 

Alternativ, wenn Sie nur die Kreuzung wollen, Enumerable.Intersect mit effizienter wäre:

list = list.Intersect(list2).ToList(); 

Der Unterschied ist, Im letzteren Fall erhalten Sie keine doppelten Einträge. Wenn zum Beispiel list2 2 enthält, erhalten Sie im ersten Fall {2,2,4,5}, in der zweiten erhalten Sie {2,4,5}.

+0

siehe meine Verbesserung zu dieser Antwort (unten), wenn Sie Objekte anstelle von Skalaren vergleichen – horace

8

Diese Frage wurde als beantwortet markiert, aber es gibt einen Haken. Wenn Ihre Liste ein Objekt und keinen Skalar enthält, müssen Sie etwas mehr Arbeit erledigen.

Ich versuchte dies immer wieder mit Remove() und RemoveAt() und alle möglichen Dinge und keiner von ihnen funktionierte korrekt. Ich konnte nicht einmal ein Contains() erhalten, um korrekt zu funktionieren. Niemals etwas gefunden. Ich war ratlos, bis ich den Verdacht hatte, dass es den Gegenstand vielleicht nicht richtig zuordnen konnte.

Als ich das erkannte, ich refaktoriert die Element Klasse, IEquatable zu implementieren, und dann begann es zu arbeiten.

Hier ist meine Lösung:

class GenericLookupE : IEquatable<GenericLookupE> 
{ 
    public string ID { get; set; } 

    public bool  Equals(GenericLookupE other) 
    { 
     if (this.ID == other.ID)  return true; 

     return false; 
    } 
} 

Nachdem ich dies tat, die oben RemoveAll() Antwort von Reed Copsey arbeitete perfekt für mich.

See: http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

8
list = list.Except(list2).ToList(); 
2

einfachere Lösung für Objekte als Horace gab:

Wenn Ihre Liste ein Objekt, sondern als einen Skalar enthält, das so einfach ist, durch durch eine ausgewählte Eigenschaft zu entfernen der Objekte:

var a = allActivePatientContracts.RemoveAll(x => !allPatients.Select(y => y.Id).Contains(x.PatientId)); 
Verwandte Themen