2013-08-27 6 views
20

मैं दो बाइट एरे की समानता की जांच कर रहा हूं, और मुझे कुछ मदद चाहिए क्योंकि सरणी बराबर होती है, भले ही मैं झूठ लौटाता हूं।दो बाइट एरे के लिए समानता की जांच

मेरे डीबग के भीतर मैं देख सकता था कि ए 1 और बी 1 दोनों बराबर हैं, लेकिन यह लूप को बढ़ाने के लिए अंदर नहीं जा रहा है।

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

यह हमेशा झूठा लौटाता है: (a1[i]==b1[i])

+5

आपका रिटर्न स्टेटमेंट कहां है? – Moop

+0

हैशब बी 1 होना चाहिए? –

+0

जहां तक ​​मैं इसे बता सकता हूं, कुछ भी वापस नहीं आता –

उत्तर

31

आपको कहीं भी वापसी मूल्य जोड़ने की आवश्यकता है। यह काम करना चाहिए:

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

लेकिन यह बहुत सरल है:

return a1.SequenceEqual(b1); 

वैकल्पिक रूप से, आप नेट 4 से IStructuralEquatable इस्तेमाल कर सकते हैं:

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

मैं इसका उपयोग दो अलग-अलग फाइलों की तुलना करने के लिए कर रहा हूं और अंतर (जो रिकॉर्ड जोड़े गए थे या हटा दिए गए थे) को वापस नहीं करते हैं, यह नहीं चलता है कि यह ठीक से चलता है और लूप करता है मुझे उन फ़ाइलों के अंतर के बारे में एक लौटा संदेश नहीं मिल रहा है जिसमें एक फ़ाइल के रिकॉर्ड हटा दिए गए थे – Masriyah

+0

@Masriyah तो आप वास्तव में क्या करना चाहते हैं एक diff एल्गोरिदम लागू है? समानता की जांच करने की तुलना में यह एक पूरी तरह से अलग कार्य है। मैं आपको Google की [diff-match-patch] (https://code.google.com/p/google-diff-match-patch/) लाइब्रेरी को देखने की सलाह देता हूं। –

+0

मैं आगे बढ़ गया और मेरे कोड के अन्य हिस्सों को अपलोड किया जो इससे संबंधित है। हो सकता है कि आप कुछ नज़र डालें और कुछ बताएं। मैं पूरे दिन इस सर्कल में दौड़ रहा हूं। धन्यवाद – Masriyah

1

यह काम करना चाहिए:

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

आप कुछ बदले बयान जोड़ना चाहिए:

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

या, बेहतर अभी तक

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

आपका दूसरा जवाब इंडेक्सऑटऑफबाउंड अपवाद – Moop

+1

फेंक सकता है पहले लंबाई की जांच करें, यह कम महंगा है। –

+2

पहला काम नहीं करेगा क्योंकि अगर 'a1.Length == 0' और 'b1.Length> 0' –

30

समानता की जाँच करने के लिए आप बस लिख सकते हैं:

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

तकनीकी रूप से LINQ की आवश्यकता होती है जो उसके ढांचे से मेल नहीं खाती है – Moop

+8

लेकिन यदि यह अपने ढांचे से मेल खाता है तो यह एक बेहतर तरीका है ऐसा करने का –

+1

@Moop Linq अब 6 साल से आसपास रहा है, निश्चित रूप से अधिकांश लोगों ने अब तक कम से कम ढांचे 3.5 तक अपग्रेड कर दिया है। – Magnus

3

मैं कुछ शॉर्ट सर्किट की सलाह देते हैं चीजों को थोड़ा सा सरल बनाने के लिए, और object.ReferenceEquals का उपयोग शॉर्ट-सर्किट में मामलों के लिए करते हैं जब सरणी एक ही संदर्भ होते हैं (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; 
} 
संबंधित मुद्दे