2013-06-20 50 views
39

Ok, vì vậy đây có thể là câu hỏi cơ bản nhưng tôi sẽ đánh giá cao câu trả lời.C# so sánh hai mảng chuỗi

Giả sử chúng ta có 5 chuỗi mảng như vậy:

string[] a = {"The","Big", "Ant"}; 
string[] b = {"Big","Ant","Ran"}; 
string[] c = {"The","Big","Ant"}; 
string[] d = {"No","Ants","Here"}; 
string[] e = {"The", "Big", "Ant", "Ran", "Too", "Far"}; 

Có một phương pháp để so sánh các chuỗi với nhau mà không cần lặp qua chúng trong C# như vậy mà chỉ a và c sẽ mang lại boolean true? Nói cách khác, tất cả các phần tử phải bằng nhau và mảng phải có cùng kích thước? Một lần nữa, không sử dụng vòng lặp nếu có thể. Cảm ơn trước!

+0

Bạn có thể đơn giản hóa việc so sánh bằng cách sử dụng string.Join và bạn có thể thoát khỏi vòng bằng cách sử dụng LINQ nhưng dưới mui xe bạn vẫn đang lặp - bạn đang cố gắng làm điều đó mà không có vòng vì một lý do? – Charleh

+0

trông giống như trùng lặp như http://stackoverflow.com/questions/2913287/comparing-arrays-using-linq-in-c-sharp và http://stackoverflow.com/questions/713341/comparing-arrays-in-c -sharp –

Trả lời

63

Bạn có thể sử dụng LINQ:

bool areEqual = a.SequenceEqual(b); 
+7

@WesField: Lưu ý rằng phương thức này cũng lặp lại, chỉ vì yêu cầu của bạn là _ "không lặp" _. Tất nhiên không thể so sánh nhiều mục mà không lặp. Cũng lưu ý rằng nó sử dụng trình so sánh mặc định theo mặc định, nó hoạt động với các kiểu giá trị và kiểu .NET. Đối với các kiểu tham chiếu tùy chỉnh, bạn cần phải tạo một tuỳ chỉnh 'IEqualityComparer ' cho ['SequenceEqual'] (http://msdn.microsoft.com/en-us/library/bb342073.aspx) và/hoặc ghi đè' Equals' và ' GetHashCode'. –

+0

@TimSchmelter: Vâng, tôi nhận ra rằng một vòng lặp đang được thực hiện đằng sau hậu trường, tôi chỉ muốn một cái gì đó gọn gàng và xinh đẹp mà không có chỗ cho một muck up. –

+6

Trả về false khi hai mảng có cùng giá trị giống nhau, nhưng theo thứ tự khác nhau. – tdgtyugdyugdrugdr

13

Hãy thử sử dụng Enumerable.SequenceEqual:

var equal = Enumerable.SequenceEqual(a, b); 
+1

Cũng là một câu trả lời hay. Bạn có thể giải thích sự khác biệt giữa điều này và LINQ a.SequenceEqual (b)? –

+2

Cùng một điều - những người sử dụng cú pháp phương pháp mở rộng, người kia đang sử dụng phương pháp mở rộng một cách rõ ràng. Xem xét phương pháp mở rộng sig để biết chi tiết http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx – Charleh

+2

@WesField: Không có sự khác biệt. Một phương thức mở rộng chỉ là một phương thức tĩnh trong một lớp tĩnh. Vì vậy, bạn có thể coi nó như là một phương pháp tĩnh bình thường (câu trả lời này) hoặc bạn sử dụng nó như là phương pháp mở rộng (câu trả lời của Ahmed). –

3

Nếu bạn muốn so sánh chúng tất cả trong một bước:

string[] a = { "The", "Big", "Ant" }; 
string[] b = { "Big", "Ant", "Ran" }; 
string[] c = { "The", "Big", "Ant" }; 
string[] d = { "No", "Ants", "Here" }; 
string[] e = { "The", "Big", "Ant", "Ran", "Too", "Far" }; 

// Add the strings to an IEnumerable (just used List<T> here) 
var strings = new List<string[]> { a, b, c, d, e }; 

// Find all string arrays which match the sequence in a list of string arrays 
// that doesn't contain the original string array (by ref) 
var eq = strings.Where(toCheck => 
          strings.Where(x => x != toCheck) 
          .Any(y => y.SequenceEqual(toCheck)) 
        ); 

Returns cả các trận đấu (bạn có lẽ có thể mở rộng mục này để loại trừ các mục đã khớp với tôi giả sử)

+0

Cảm ơn, có lẽ sẽ không sử dụng thời gian này, nhưng nó là một lựa chọn tiện lợi. –

-1
 if (a.Length == d.Length) 
     { 
      var result = a.Except(d).ToArray(); 
      if (result.Count() == 0) 
      { 
       Console.WriteLine("OK"); 
      } 
      else 
      { 
       Console.WriteLine("NO"); 
      } 
     } 
     else 
     { 
      Console.WriteLine("NO"); 
     }