2013-08-27 33 views
20

Tôi đang kiểm tra tính bình đẳng của hai mảng byte và tôi muốn một số trợ giúp vì những gì tôi đã trả về sai mặc dù các mảng phải bằng nhau.Kiểm tra tính bình đẳng cho hai mảng byte

Trong khi gỡ lỗi, tôi có thể thấy cả a1 và b1 bằng nhau, nhưng nó sẽ không đi vào bên trong vòng lặp while để tăng 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; 
} 

Điều này luôn trả về false: (a1[i]==b1[i]).

+5

Bản sao kê khai thuế của bạn ở đâu? – Moop

+0

HashB có phải là b1 không? –

+0

theo như tôi có thể nói nó không trả lại bất cứ điều gì –

Trả lời

31

Bạn cần thêm giá trị trả lại ở đâu đó. Điều này sẽ làm việc:

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; 
} 

Nhưng đây là nhiều đơn giản hơn:

return a1.SequenceEqual(b1); 

Ngoài ra, bạn có thể sử dụng IStructuralEquatable từ NET 4:

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

Tôi đang sử dụng điều này để so sánh hai tệp khác nhau và trả về sự khác biệt (bản ghi đã được thêm vào hoặc xóa) không phải là nó chạy và vòng lặp chính xác mà tôi không nhận được thông báo trả về sự khác biệt của tệp trong đó một tệp đã bị xóa – Masriyah

+0

@ Masriyah Vì vậy, những gì bạn thực sự muốn làm là thực hiện một thuật toán khác? Đó là một nhiệm vụ hoàn toàn khác so với việc kiểm tra bình đẳng. Tôi khuyên bạn nên xem thư viện [diff-match-patch] (https://code.google.com/p/google-diff-match-patch/) của Google. –

+0

Tôi đã tiếp tục và tải lên các phần khác của mã của tôi có liên quan đến điều này. Có lẽ bạn có thể xem và chỉ ra điều gì đó. Tôi đã chạy vòng quanh với vòng tròn này cả ngày. cảm ơn – Masriyah

1

này nên làm việc:

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

Bạn nên thêm một số báo cáo lợi nhuận:

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; 
} 

Hoặc, tốt hơn chưa

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

Câu trả lời thứ hai của bạn có thể ném một ngoại lệ IndexOutOfBounds – Moop

+1

Thực hiện kiểm tra độ dài trước, nó ít tốn kém hơn. –

+2

Việc đầu tiên sẽ không hoạt động bởi vì nếu 'a1.Length == 0' và' b1.Length> 0' –

30

Để kiểm tra bình đẳng bạn chỉ có thể viết:

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

Điều đó đòi hỏi kỹ thuật LINQ mà có thể không phù hợp với khung của mình – Moop

+8

Nhưng nếu nó phù hợp với khung của mình thì đó là cách tốt hơn nhiều làm việc đó. –

+1

@Moop Linq đã được khoảng 6 năm nay, chắc chắn hầu hết mọi người đã nâng cấp lên ít nhất là khung 3.5 bây giờ. – Magnus

3

tôi khuyên bạn nên một số ngắn mạch để làm cho mọi thứ đơn giản hơn một chút và sử dụng object.ReferenceEquals để đoản mạch đối với các trường hợp khi các mảng có cùng tham chiếu (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; 
} 
Các vấn đề liên quan