2013-01-07 14 views
9

Ich habe zwei Listen. Ich möchte alle Elemente aus LIST1 entfernen, die NICHT in LIST2 vorhanden sind.LINQ zwei Listen vergleichen und entfernen

So zum Beispiel:

 var list1 = new List<DownloadTask>(); 
     list1.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 2, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 3, MachineID = 1 }); 
     list1.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

     var list2 = new List<DownloadTask>(); 
     list2.Add(new DownloadTask{ OperationID = 1, MachineID = 1 }); 
     list2.Add(new DownloadTask{ OperationID = 3, MachineID = 2 }); 

Nach Lauf list1 sollten nur Elemente enthalten: mit Kombination operationId = 1, machineId = 1 UND OperationId = 3, MachineId =2.

+0

Mit anderen Worten, Sie möchten die Menge der gemeinsamen Elemente in diesen beiden Listen herausfinden. – user3454439

Antwort

13

Does DownloadTask Überschreibung Equals und GetHashCode korrekt? Wenn ja, alles, was Sie brauchen, ist:

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

das ist, wenn du glücklich bist eine neue Liste, natürlich zu erstellen. Wenn Sie sie wirklich aus der bestehenden Liste entfernen möchten, ist es etwas schwieriger. Es wäre sehr wahrscheinlich einfachste sein, herauszufinden, was das Ergebnis aussehen soll, dann klar und Re-add:

var newList = list1.Intersect(list2).ToList(); 
list1.Clear(); 
list1.AddRange(newList); 

Natürlich all dies tut Sie benötigen Gleichheit in geeigneter Weise in DownloadTask zu implementieren - aber wenn Sie haben es noch nicht getan, es klingt, als wäre es eine gute Idee, dies zu tun. (Oder zumindest implementieren IEqualityComparer<DownloadTask> irgendwo - Sie einen Vergleich zu Intersect passieren können.)

Als Randbemerkung, sehe ich „nur die Elemente halten in list1 die auch in list2“ (dh Kreuzung) als einfachere Art und Weise der auf das Problem als "alle Elemente aus list1, die nicht in list2 sind" entfernen - das letztere ist im Grunde eine doppelte negative, die immer ein bisschen Schmerz ist.

16

denke ich es sein sollte:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID)); 
+0

Danke, eine wirklich zufriedene Codezeile ... – Avishek

5
var lst = (from lst1 in list1 
      where !list2.Any(
           x => x.OperationID == lst1.OperationID && 
            x.MachineID == lst1.MachineID) 
      select lst1).ToList(); 

    list1 = lst.ToList(); 

Bitte versuchen Sie es, es sollte gearbeitet werden.

+0

Es funktioniert ... Thnak du ..... –

Verwandte Themen