2009-03-16 2 views
35

में सरणी की समानता का परीक्षण मेरे पास दो सरणी हैं। उदाहरण के लिए:सी #

int[] Array1 = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
int[] Array2 = new[] {9, 1, 4, 5, 2, 3, 6, 7, 8}; 

यह निर्धारित करने का सबसे अच्छा तरीका क्या है कि उनके पास समान तत्व हैं या नहीं?

+0

आप वास्तव में संख्या के साथ काम कर या वह यह है कि कर रहे हैं सिर्फ उदाहरण के लिए? – mmcdole

+0

क्या आप इसके बजाय सूची सूची का उपयोग कर सकते हैं (पहले से ही इसमें विधि शामिल है)? –

+1

@ed यह एक साधारण शामिल नहीं था, लेकिन दोनों सरणी को निर्धारित करने के लिए एक ही तत्व हैं, प्रश्न को दोबारा पढ़ें और जवाब देखें :) – eglasius

उत्तर

20

LINQ का उपयोग कर आप यह अर्थपूर्ण ढंग से लागू कर सकते हैं और performant:

var q = from a in ar1 
     join b in ar2 on a equals b 
     select a; 

bool equals = ar1.Length == ar2.Length && q.Count() == ar1.Length; 
+0

इस कोड स्निपेट के लिए धन्यवाद। मेरे परिदृश्य के लिए एक आकर्षण की तरह काम करता है !! – SudheerKovalam

+5

मुझे लगता है कि यह सिर्फ एक लूप करने और प्रत्येक आइटम की तुलना करने से बहुत धीमी है।लूप उतना अच्छा लग सकता है, लेकिन बहुत तेज़ नहीं। –

+0

मुझे इसके बारे में निश्चित नहीं है। जहां तक ​​मुझे पता है कि LINQ-to-ऑब्जेक्ट्स इंटरमीडिएट हैश टेबल जेनरेट्स पर लूप करने के लिए उत्पन्न करते हैं जो सीधे लूप से बहुत तेज़ होते हैं। –

1

मुझे समाधान बहुत विस्तृत तरीके से here का समाधान मिला है, हालांकि कुछ लोगों के लिए थोड़ा वर्बोज़ है।

सबसे अच्छी बात यह है कि यह अन्य IENumerables के लिए भी काम करता है।

+0

वह लिंक SequenceEqual (.NET 3.5 में) का वर्णन करता है, और इस डेटा पर झूठी वापसी करेगा क्योंकि वे एक अलग क्रम में हैं। –

+1

संदर्भ के लिए, यह होगा (एक्सटेंशन विधियों का उपयोग करके) बूल areEqual = array1.SequenceEqual (array2); –

10

क्या मूल्य हमेशा अद्वितीय होंगे? यदि हां, तो कैसे के बारे में (बराबर लंबाई की जाँच के बाद):

var set = new HashSet<int>(array1); 
bool allThere = array2.All(set.Contains); 
+0

मार्क, मैं 'आईस्ट्रक्चरल एक्वाटेबल' (टुपल्स और एरेज़) के माध्यम से भी तुलना कर सकता हूं। तो मुझे 'अनुक्रमिक एक्वाटेबल' बनाम 'अनुक्रम एक्वाल' चुनना चाहिए? –

+1

'set.SetEquals (array2)' अधिक पठनीय नहीं है? – nawfal

5
var shared = arr1.Intersect(arr2); 
bool equals = arr1.Length == arr2.Length && shared.Count() == arr1.Length; 
87

तुम भी SequenceEqual इस्तेमाल कर सकते हैं, IEnumerable वस्तुओं प्रदान की पहले क्रमबद्ध हैं।

int[] a1 = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
int[] a2 = new[] { 9, 1, 4, 5, 2, 3, 6, 7, 8 };  

bool equals = a1.OrderBy(a => a).SequenceEqual(a2.OrderBy(a => a)); 
+2

हां, सॉर्ट/ऑर्डर करें तो सीक्वेंस एक्वाल –

6

एक्सटेंशन विधियों का उपयोग करें (जो 3.0 में नए हैं)। यदि दो सरणी के छेड़छाड़ की लंबाई उनके संघ के बराबर होती है तो सरणी बराबर होती है।

bool equals = arrayA.Intersect(arrayB).Count() == arrayA.Union(arrayB).Count() 

संक्षिप्त।

5

फ्रेमवर्क 4.0 IStructuralEquatable इंटरफेस पेश किया जो इस प्रकार की सरणियों या tuples के रूप में प्रकार की तुलना करने में मदद करता है:

class Program 
    { 
     static void Main() 
     { 
      int[] array1 = { 1, 2, 3 }; 
      int[] array2 = { 1, 2, 3 }; 
      IStructuralEquatable structuralEquator = array1; 
      Console.WriteLine(array1.Equals(array2));         // False 
      Console.WriteLine(structuralEquator.Equals(array2, EqualityComparer<int>.Default)); // True 

      // string arrays 
      string[] a1 = "a b c d e f g".Split(); 
      string[] a2 = "A B C D E F G".Split(); 
      IStructuralEquatable structuralEquator1 = a1; 
      bool areEqual = structuralEquator1.Equals(a2, StringComparer.InvariantCultureIgnoreCase); 

      Console.WriteLine("Arrays of strings are equal:"+ areEqual); 

      //tuples 
      var firstTuple = Tuple.Create(1, "aaaaa"); 
      var secondTuple = Tuple.Create(1, "AAAAA"); 
      IStructuralEquatable structuralEquator2 = firstTuple; 
      bool areTuplesEqual = structuralEquator2.Equals(secondTuple, StringComparer.InvariantCultureIgnoreCase); 

      Console.WriteLine("Are tuples equal:" + areTuplesEqual); 
      IStructuralComparable sc1 = firstTuple; 
      int comparisonResult = sc1.CompareTo(secondTuple, StringComparer.InvariantCultureIgnoreCase); 
      Console.WriteLine("Tuples comarison result:" + comparisonResult);//0 
     } 
    } 
1

यह जाँच करेगा कि प्रत्येक सरणी के क्रम में एक ही मान हैं।

int[] ar1 = { 1, 1, 5, 2, 4, 6, 4 }; 
int[] ar2 = { 1, 1, 5, 2, 4, 6, 4 }; 

var query = ar1.Where((b, i) => b == ar2[i]); 

Assert.AreEqual(ar1.Length, query.Count()); 
0
public static bool ValueEquals(Array array1, Array array2) 
    { 
     if(array1 == null && array2 == null) 
     { 
      return true; 
     } 

     if((array1 == null) || (array2 == null)) 
     { 
      return false; 
     } 

     if(array1.Length != array2.Length) 
     { 
      return false; 
     } 
     if(array1.Equals(array2)) 
     { 
      return true; 
     } 
     else 
     { 
      for (int Index = 0; Index < array1.Length; Index++) 
      { 
       if(!Equals(array1.GetValue(Index), array2.GetValue(Index))) 
       { 
        return false; 
       } 
      } 
     } 
     return true; 
    }