Klingt wie Sie wollen alles in array2
außer was in array1
ist:
var onlyInArray2 = array2.Except(array1);
Natürlich, wenn Sie auch wissen wollte, was nur in array1
war Sie nutzen könnten:
var onlyInArray1 = array1.Except(array2);
(Dies alles erfordert .NET 3.5 oder höher oder eine alternative LINQ to Objects-Implementierung wie LINQBridge.)
Ich nehme an, dass die Reihenfolge nicht wichtig ist, wenn Sie Unterschiede berechnen - Except
ist ein Set-basierter Operator, also wird davon ausgegangen, dass Sie die Sammlungen als Sets betrachten.
Beachten Sie, dass Except
gibt nur ein IEnumerable<T>
- wenn Sie die Ergebnisse als Arrays wollen, müssen Sie ToArray
nennen:
var onlyInArray2 = array2.Except(array1).ToArray();
var onlyInArray1 = array1.Except(array2).ToArray();
Wenn Sie die symmetrische Differenz wollen, dh Sie nur darüber, welche Werte kümmern sind in einem einzigen Array, anstatt dem Array sie kamen, könnten Sie verwenden:
var onlyInOneArray = array1.Union(array2).Except(array1.Intersect(array2));
oder könnten Sie HashSet
direkt verwenden:
var set = new HashSet<string>(array1);
// This modifies the set...
set.SymmetricExceptWith(array2);
In all diesen Fällen ist die resultierende Reihenfolge nicht definiert, obwohl in der Praxis Except
die ursprüngliche Reihenfolge des ersten Arguments beibehalten wird. Während dies streng genommen ein Implementierungsdetail ist, denke ich, dass es sehr unwahrscheinlich ist, dass es sich ändert.
Wie die anderen Set-basierten Operatoren in LINQ, Except
wird nur jedes Element zurück, sobald - also, wenn COM8
in array2
zweimal erschienen, wäre es nur einmal im Ergebnis erscheinen.
Es wäre wirklich zu lösen helfen wenn Sie genauere Angaben zu dem Vergleich machen würden, den Sie machen möchten. Zum Beispiel, halten Sie die Reihenfolge für wichtig? Fall? Was ist, wenn ein Element in "com1" aber nicht "com2" vorkommt? –