Brzmi jak chcesz wszystko w array2
wyjątkiem co w array1
:
var onlyInArray2 = array2.Except(array1);
Oczywiście, jeśli również chciał wiedzieć, co było tylko w array1
można użyć:
var onlyInArray1 = array1.Except(array2);
(To wszystko wymaga .NET 3.5 lub wyższej lub alternatywnej implementacji LINQ to Objects, takiej jak LINQBridge.)
Zakładam, że kolejność nie jest ważna przy obliczaniu różnic - Except
jest operatorem opartym na zestawie, więc zakłada, że traktuje się kolekcje jako zestawy.
Zauważ, że Except
prostu zwraca IEnumerable<T>
- jeśli chcesz wyniki jako tablic, trzeba zadzwonić ToArray
:
var onlyInArray2 = array2.Except(array1).ToArray();
var onlyInArray1 = array1.Except(array2).ToArray();
Jeśli chcesz różnica symetryczna, tzn tylko dbają o których wartości są w jednej tablicy, zamiast którego tablica z którego pochodzą, można użyć:
var onlyInOneArray = array1.Union(array2).Except(array1.Intersect(array2));
lub można użyć HashSet
bezpośrednio:
var set = new HashSet<string>(array1);
// This modifies the set...
set.SymmetricExceptWith(array2);
We wszystkich tych przypadkach wynikowa kolejność jest niezdefiniowana, chociaż w praktyce Except
zachowa pierwotną kolejność pierwszego argumentu. Chociaż jest to ściśle rzecz biorąc szczegół wdrożenia, myślę, że jest mało prawdopodobne, aby się to zmieniło.
Podobnie jak inne podmioty gospodarcze określone oparte na LINQ, Except
powróci tylko raz dowolnego elementu - więc jeśli COM8
pojawił się dwa razy w array2
, wydaje się tylko raz w wyniku.
Byłoby naprawdę pomóc jeśli chcesz podać więcej szczegółów na temat porównania, które chcesz zrobić. Na przykład, czy uważasz porządek za ważny? Walizka? A co jeśli element występuje w 'com1', ale nie' com2'? –