2009-03-16 6 views
35

Tôi có hai mảng. Ví dụ:Kiểm tra tính bình đẳng của các mảng trong C#

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

Cách tốt nhất để xác định xem chúng có cùng yếu tố không?

+0

Bạn có thực sự đối phó với những con số hay là chỉ dành riêng cho ví dụ? – mmcdole

+0

Thay vào đó, bạn có thể sử dụng Danh sách (đã có phương pháp Chứa) không? –

+1

@ed nó không phải là về một chứa đơn giản, nhưng xác định cả hai mảng có cùng một yếu tố, đọc lại câu hỏi và xem câu trả lời :) – eglasius

Trả lời

20

Bằng cách sử dụng LINQ bạn có thể thực hiện nó expressively và 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

Cảm ơn đoạn mã này. Làm việc như một nét duyên dáng cho kịch bản của tôi !! – SudheerKovalam

+5

Tôi thấy điều này chậm hơn nhiều so với việc chỉ thực hiện vòng lặp và so sánh từng mục.Vòng lặp có thể không đẹp, nhưng nhanh hơn nhiều. –

+0

Tôi không chắc chắn về điều đó. Theo như tôi biết LINQ-to-Objects tạo ra các bảng băm trung gian để lặp qua các phép nối nhanh hơn nhiều so với một vòng lặp thẳng. –

1

Tôi đã tìm thấy giải pháp chi tiết here là một cách rất rõ ràng, mặc dù một chút tiết cho một số người.

Điều tốt nhất là nó hoạt động cho các IEnumerables khác.

+0

Liên kết đó mô tả SequenceEqual (trong .NET 3.5) và sẽ trả về false trên dữ liệu này vì chúng theo thứ tự khác. –

+1

Để tham khảo, nó sẽ là (sử dụng các phương thức mở rộng) bool areEqual = array1.SequenceEqual (array2); –

10

Giá trị luôn luôn là duy nhất? Nếu vậy, làm thế nào về (sau khi kiểm tra chiều dài bằng nhau):

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

marc, tôi cũng có thể so sánh thông qua 'IStructuralEquatable' (bộ dữ liệu và mảng). Vì vậy, khi nào tôi nên chọn 'IStructuralEquatable' so với 'SequenceEqual'? –

+1

Không phải 'set.SetEquals (array2)' có thể đọc được không? – nawfal

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

Bạn cũng có thể sử dụng SequenceEqual, với điều kiện các đối tượng IEnumerable được sắp xếp trước.

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

yep, sắp xếp/sắp xếp rồi SequenceEqual –

6

Sử dụng các phương pháp mở rộng (tính năng mới trong 3.0). Nếu chiều dài của Intersection của hai mảng bằng với Liên minh của chúng thì các mảng là như nhau.

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

gọn gàng.

5

Framework 4.0 giới thiệu giao diện IStructuralEquatable giúp để so sánh các loại như mảng hoặc các bộ:

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

này sẽ kiểm tra rằng mỗi mảng chứa các giá trị tương tự theo thứ tự.

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