2013-06-20 33 views
39

Tamam, bu basit bir soru olabilir ama bir cevabı takdir ediyorum.C# iki dizi dizileri karşılaştırarak

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

sadece a ve c gerçek boole'sini doğuracak şekilde C# içlerinden döngü olmadan birbirlerine bu dizeleri karşılaştırmak için bir yöntem var mı:

biz gibi 5 dize diziler var ki? Diğer bir deyişle, tüm elemanlar eşit olmalı ve dizi aynı büyüklükte olmalı mı? Yine mümkünse bir döngü kullanmadan. Şimdiden teşekkürler!

+0

string.Join kullanarak karşılaştırmayı basitleştirebilir ve Linq kullanarak döngülerden uzaklaşabilirsiniz, ancak hala döngü oluştururken kapağın altında - bir sebepten döngüler olmadan yapmaya mı çalışıyorsunuz? – Charleh

+0

, http://stackoverflow.com/questions/2913287/comparing-arrays-using-linq-in-c-sharp ve http://stackoverflow.com/questions/713341/comparing-arrays-in-c gibi kopyalara benziyor. -sharp –

cevap

63

Sen Linq kullanabilirsiniz:

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

@WesField: Gereksiniminizin _ "loop olmadan" olduğu için bu yöntemin de döngüye girdiğini unutmayın. Elbette döngü olmadan birden çok öğeyi karşılaştırmak imkansız. Ayrıca, değer türleri ve .NET türleri için çalışan varsayılan karşılaştırmayı varsayılan olarak kullandığını unutmayın. Özel referans türleri için, ['SequenceEqual'] (http://msdn.microsoft.com/en-us/library/bb342073.aspx) ve/veya" Equals "ve/veya geçersiz kılmaları için bir özel' IEqualityComparer 'oluşturmalısınız. GetHashCode'. –

+0

@TimSchmelter: Evet, sahnelerin ardında bir döngü gerçekleştirildiğinin farkındayım, sadece bir şeyleri temizlemeksizin düzgün ve güzel görünümlü bir şey istedim. –

+6

İki dizinin tam olarak aynı değerleri olduğunda, ancak farklı sırayla döndürür. – tdgtyugdyugdrugdr

13

Enumerable.SequenceEqual kullanmayı deneyin:

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

Ayrıca iyi bir cevap. Bu ve Linq a.SequenceEqual (b) arasındaki farkları açıklar mısınız? –

+2

Aynı şey - uzantı yöntemi sözdizimini kullananlar, diğeri ise uzantı yöntemini açıkça kullanıyor. Ayrıntılar için uzantı yöntemine bakın http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx – Charleh

+2

@WesField: Fark yoktur. Bir uzantı yöntemi, statik bir sınıfta yalnızca statik bir yöntemdir. Böylece normal bir statik yöntem olarak (bu cevap) tedavi edebilir ya da uzatma yöntemi olarak kullanabilirsiniz (Ahmed'in cevabı). –

3

tek seferde hepsini karşılaştırmak isterseniz:

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

İade hem eşleşmeleri (seni

, zaten eşleştirdiğim öğeleri hariç tutmak için bunu genişletebilirdi.
+0

Teşekkürler, muhtemelen bu sefer kullanmayacaksınız, ama şık bir seçenektir. –

-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"); 
     } 
İlgili konular