2013-08-27 14 views
20

Sprawdzam równość dwóch tablic bajtowych i chciałem pomocy, ponieważ to co zwróciło fałsz, mimo że tablice powinny być równe.Sprawdzanie równości dla dwóch tablic bajtowych

Wewnątrz mojego debugowania widziałem zarówno a1 jak i b1 są równe, ale to nie wchodzi w pętlę while do inkrementacji i.

public bool Equality(byte[] a1, byte[] b1) 
{ 
    int i; 
    bool bEqual; 
    if (a1.Length == b1.Length) 
    { 
     i = 0; 
     while ((i < a1.Length) && (a1[i]==b1[i])) 
     { 
      i++; 
     } 

     if (i == a1.Length) 
     { 
      bEqual = true; 
     } 
    } 
    return bEqual; 
} 

To zawsze zwraca wartość false: (a1[i]==b1[i]).

+5

Gdzie jest zwrot? – Moop

+0

Czy hashB ma być b1? –

+0

o ile mogę powiedzieć, że nic nie zwraca. –

Odpowiedz

31

Musisz gdzieś dodać wartość zwracaną. To powinno działać:

public bool Equality(byte[] a1, byte[] b1) 
{ 
    int i; 
    if (a1.Length == b1.Length) 
    { 
     i = 0; 
     while (i < a1.Length && (a1[i]==b1[i])) //Earlier it was a1[i]!=b1[i] 
     { 
      i++; 
     } 
     if (i == a1.Length) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

Ale to jest znacznie prostsze:

return a1.SequenceEqual(b1); 

Alternatywnie, można użyć IStructuralEquatable z .NET 4:

return ((IStructuralEquatable)a1).Equals(b1, StructuralComparisons.StructuralEqualityComparer) 
+0

używam tego do porównywania dwóch różnych plików i zwracam różnicę (jakie rekordy zostały dodane lub usunięte), a nie, że działa i pętle poprawnie nie otrzymuję zwróconej wiadomości o różnicy plików, w których jeden plik miał usunięte rekordy – Masriyah

+0

@Masriyah Więc co naprawdę chcesz zrobić, to zaimplementować algorytm diff? To zupełnie inne zadanie niż po prostu sprawdzanie równości. Polecam zapoznanie się z biblioteką Google [diff-match-patch] (https://code.google.com/p/google-diff-match-patch/). –

+0

Poszedłem dalej i przesłałem pozostałe części mojego kodu, które się z tym wiążą. Może możesz rzucić okiem i coś wskazać. biegłam w kółko przez cały dzień. dzięki – Masriyah

1

To powinno działać:

public bool Equality(byte[] a1, byte[] b1) 
{ 
    if(a1 == null || b1 == null) 
     return false; 
    int length = a1.Length; 
    if(b1.Length != length) 
     return false; 
    while(length >0) { 
     length--; 
     if(a1[length] != b1[length]) 
      return false;   
    } 
    return true;   
} 
0

Należy dodać niektóre wypowiedzi Powrót:

public bool Equality(byte[] a1, byte[] b1) 
{ 
    int i = 0; 
    if (a1.Length == b1.Length) 
    { 
     while ((i < a1.Length) && (a1[i]==b1[i])) 
     { 
      i++; 
     } 
    } 
    return i == a1.Length; 
} 

Albo, jeszcze lepiej

public bool Equality(byte[] a1, byte[] b1) 
{ 
    if(a1.Length != b1.Length) 
    { 
     return false; 
    } 

    for (int i = 0; i < a1.Length; i++) 
    { 
     if (a1[i] != b1[i]) 
     { 
      return false; 
     } 
    } 
    return true; 
} 
+1

Twoja druga odpowiedź może rzucić wyjątek IndexOutOfBounds – Moop

+1

Najpierw sprawdź długość, jest tańsza. –

+2

Pierwsza nie będzie działać, ponieważ jeśli "a1.Length == 0" i "b1.Length> 0' –

30

Aby sprawdzić równość można po prostu napisać:

var areEqual = a1.SequenceEqual(b1); 
+1

To technicznie wymaga LINQ, który może nie pasować do jego struktury – Moop

+8

Ale jeśli nie pasuje do jego ramy to jest o wiele lepszy sposób robienia tego. –

+1

@Moop Linq istnieje już od 6 lat, z pewnością większość osób zaktualizowała się do co najmniej wersji 3.5. – Magnus

3

Chciałbym polecić jakieś zwarcia aby nieco uprościć i użyć object.ReferenceEquals do zwarcia dla przypadków, gdy tablice mają takie same referencje (a1 = b1):

public bool Equality(byte[] a1, byte[] b1) 
{ 
    // If not same length, done 
    if (a1.Length != b1.Length) 
    { 
     return false; 
    } 

    // If they are the same object, done 
    if (object.ReferenceEquals(a1,b1)) 
    { 
     return true; 
    } 

    // Loop all values and compare 
    for (int i = 0; i < a1.Length; i++) 
    { 
     if (a1[i] != b1[i]) 
     { 
      return false; 
     } 
    } 

    // If we got here, equal 
    return true; 
} 
Powiązane problemy