2013-06-20 13 views
39

Ok, więc może to być podstawowe pytanie, ale byłbym wdzięczny za odpowiedź.C# porównując dwa łańcuchy tablicowe

Say mamy 5 tablic ciągów jako takie:

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

Czy istnieje sposób, aby porównać te ciągi do siebie bez zapętlenie przez nich w C# takie, że tylko i c dałoby się logiczną prawdą? Innymi słowy, wszystkie elementy muszą być równe, a tablica musi mieć ten sam rozmiar? Ponownie, bez użycia pętli, jeśli to możliwe. Z góry dziękuję!

+0

Możesz uprościć porównanie za pomocą string.Join i możesz uciec od pętli za pomocą Linq, ale pod maską wciąż masz pętle - czy próbujesz zrobić to bez pętli z jakiegoś powodu? – Charleh

+0

Wyglądają jak duplikaty jako http://stackoverflow.com/questions/2913287/porównanie-arrays-using-linq-in-c-sharp i http://stackoverflow.com/questions/713341/porównanie-arrays-in-c -sharp –

Odpowiedz

63

Można używać LINQ:

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

@WesField: Zauważ, że ta metoda również pętle, tylko dlatego, że twoje wymaganie było _ "bez pętli" _. Oczywiście nie można porównywać wielu elementów bez pętli. Zauważ również, że domyślnie używa domyślnego porównywalnika, który działa dla typów wartości i typów .NET. W przypadku niestandardowych typów referencji należy utworzyć niestandardowe 'IEqualityComparer ' dla ['SequenceEqual'] (http://msdn.microsoft.com/en-us/library/bb342073.aspx) i/lub przesłonić' Equals' i ' GetHashCode'. –

+0

@TimSchmelter: Tak, zdaję sobie sprawę, że pętla jest wykonywana za kulisami, po prostu chciałem czegoś schludnego i ładnego, bez miejsca na zgiełk. –

+6

Zwraca wartość false, gdy dwie macierze mają dokładnie takie same wartości, ale w innej kolejności. – tdgtyugdyugdrugdr

13

Spróbuj użyć Enumerable.SequenceEqual:

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

Również dobra odpowiedź. Czy mógłbyś wyjaśnić różnice między tym a Linq a.SequenceEqual (b)? –

+2

To samo - te, które używają składni metody rozszerzenia, a druga używa jawnie metody rozszerzenia. Szczegóły metody sig można znaleźć na http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx – Charleh

+2

@WesField: Nie ma różnicy. Metoda rozszerzenia to po prostu metoda statyczna w klasie statycznej. Możesz traktować to jako normalną metodę statyczną (ta odpowiedź) lub użyć jej jako metody rozszerzenia (odpowiedź Ahmeda). –

3

Jeśli chcesz porównać je wszystkie za jednym zamachem:

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

zwraca zarówno zestawienia (ci mógł prawdopodobnie rozwinąć to, aby wykluczyć elementy, które już pasują, jak sądzę)

+0

Dzięki, prawdopodobnie tym razem nie wykorzystamy, ale jest to fajna opcja. –

-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"); 
     } 
Powiązane problemy