W Javie Arrays.equals()
pozwala na łatwe porównanie zawartości dwóch podstawowych tablic (przeciążenia są dostępne dla wszystkich podstawowych typów).
Czy jest coś takiego w C #? Czy istnieje „magiczny” sposób porównywania zawartości dwóch tablic w języku C #?
Odpowiedzi:
Możesz użyć
Enumerable.SequenceEqual
. Działa to dla wszystkichIEnumerable<T>
, nie tylko tablic.źródło
SequenceEqual
może nie być dobrym wyborem pod względem wydajności, ponieważ jego obecna implementacja może w pełni wyliczyć jedno z jego źródeł, jeśli różnią się one tylko długością. W przypadku tablic moglibyśmyLength
najpierw sprawdzić równość, aby uniknąć wyliczania tablic o różnych długościach tylko po to, aby uzyskać wynikfalse
.Użyj
Enumerable.SequenceEqual
w LINQ .źródło
new int[] {1}.SequenceEquals(null) == false
Również w przypadku tablic (i krotek) można użyć nowych interfejsów z .NET 4.0: IStructuralComparable i IStructuralEquatable . Korzystając z nich możesz nie tylko sprawdzić równość tablic, ale także je porównać.
źródło
a.StructuralCompare(b)
?W przypadku .NET 4.0 i nowszych można porównać elementy w tablicy lub krotki za pomocą typu StructuralComparisons :
źródło
SequenceEqual
zwróci prawdę tylko wtedy, gdy spełnione są dwa warunki.Jeśli chcesz tylko sprawdzić, czy zawierają te same elementy niezależnie od ich kolejności, a Twój problem jest tego typu
można użyć metody rozszerzenia LINQ,
Enumerable.Except
a następnie sprawdzić, czy wynik ma jakąkolwiek wartość. Oto przykładA także dzięki temu automatycznie otrzymujesz różne przedmioty. Dwie pieczenie na jednym ogniu.
Pamiętaj, że jeśli wykonujesz swój kod w ten sposób
otrzymasz różne wyniki.
W moim przypadku mam lokalną kopię tablicy i chcę sprawdzić, czy coś zostało usunięte z oryginalnej tablicy, więc używam tej metody.
źródło
SequenceEqual
.W przypadku testów jednostkowych można użyć
CollectionAssert.AreEqual
zamiastAssert.AreEqual
.To chyba najłatwiejszy sposób.
źródło
Jeśli chcesz z
null
wdziękiem obsługiwać dane wejściowe i ignorować kolejność elementów, wypróbuj następujące rozwiązanie:Kod testu wygląda następująco:
źródło
a1 = { 1, 1 }
ia2 = { 1, 2 }
, to pierwszy test zwróci zły wynik. Deklaracja zwrotu powinna byćreturn array1.Count() == array2.Count() && !array1.Except(array2).Any() && !array2.Except(array1).Any();
W przypadku niektórych aplikacji może być lepsze:
źródło
To rozwiązanie LINQ działa, nie wiem, jak wypada w porównaniu z wydajnością do SequenceEquals. Ale obsługuje różne długości tablic, a .All zakończy działanie na pierwszym elemencie, który nie jest równy, bez iteracji po całej tablicy.
źródło
Porównanie elementarne? co powiesz na
Zastąp warunek (a == b) czymkolwiek, co chciałbyś porównać w aib.
(to łączy dwa przykłady z próbek Linq dewelopera MSDN )
źródło
true
) inull
tablic (ulegnie awarii).Zrobiłem to w studiach wizualnych i zadziałało doskonale; porównanie indeksów tablic po indeksie z krótkim tym kodem.
wyjście będzie; Pasujące liczby to 7 Niepasujące liczby to 3
źródło
null
tablic (również ulegnie awarii) i robi coś innego niż to, o co prosił OP. Poprosił tylko o znajomość równości, nie licząc, ile przedmiotów różni się lub pasuje.Zakładając, że równość tablic oznacza, że obie tablice mają równe elementy przy równych indeksach, istnieje
SequenceEqual
odpowiedź iIStructuralEquatable
odpowiedź .Ale oba mają wady, jeśli chodzi o wydajność.
SequenceEqual
Obecna implementacja nie skraca się, gdy tablice mają różne długości, więc może wyliczyć jedną z nich całkowicie, porównując każdy z jej elementów.IStructuralEquatable
nie jest ogólna i może powodować boksowanie każdej porównywanej wartości. Co więcej, nie jest to bardzo proste w użyciu i już wymaga zakodowania pewnych metod pomocniczych, które go ukrywają.Z punktu widzenia wydajności może być lepiej użyć czegoś takiego:
Ale oczywiście nie jest to też jakiś „magiczny sposób” sprawdzania równości tablic.
Tak więc obecnie nie, tak naprawdę nie ma odpowiednika Java
Arrays.equals()
w .Net.źródło
null
. O co ci chodzi?