2013-06-20 40 views
39

Ok, quindi questa potrebbe essere una domanda di base ma gradirei una risposta.C# che confronta due array di stringhe

Dire che abbiamo 5 array di stringhe in quanto tali:

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

Esiste un metodo per confrontare queste stringhe gli uni agli altri senza loop attraverso di loro in C# tale che solo A e C sarebbe cedere il booleano vero? In altre parole, tutti gli elementi devono essere uguali e l'array deve avere le stesse dimensioni? Anche in questo caso, senza utilizzare un ciclo, se possibile. Grazie in anticipo!

+0

È possibile semplificare il confronto utilizzando string.Join e si può uscire da loop usando Linq ma sotto il cofano si sta ancora eseguendo un ciclo - stai cercando di farlo senza loop per un motivo? – Charleh

+0

sembrano duplicati come http://stackoverflow.com/questions/2913287/comparing-arrays-using-linq-in-c-sharp e http://stackoverflow.com/questions/713341/comparing-arrays-in-c -sharp –

risposta

63

È possibile utilizzare Linq:

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

@WesField: si noti che questo metodo si ripete anche, solo perché il requisito era _ "senza loop" _. Ovviamente è impossibile confrontare più oggetti senza fare il loop. Si noti inoltre che utilizza il confronto predefinito per impostazione predefinita, che funziona per i tipi di valore e i tipi .NET. Per i tipi di riferimento personalizzati è necessario creare un 'IEqualityComparer personalizzato ' per ['SequenceEqual'] (http://msdn.microsoft.com/en-us/library/bb342073.aspx) e/o sovrascrivere' Equals' e ' GetHashCode'. –

+0

@TimSchmelter: Sì, mi rendo conto che un loop viene eseguito dietro le quinte, volevo solo qualcosa di pulito e di bell'aspetto, senza spazio per un letargo. –

+6

Restituisce false quando due matrici hanno esattamente gli stessi valori, ma in ordine diverso. – tdgtyugdyugdrugdr

13

Prova utilizzando Enumerable.SequenceEqual:

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

Anche una buona risposta. Potresti spiegare le differenze tra questo e il Linq a.SequenceEqual (b)? –

+2

Stessa cosa: quelli che usano la sintassi del metodo di estensione, l'altro usa esplicitamente il metodo di estensione. Guarda il metodo di estensione sig per dettagli http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx – Charleh

+2

@WesField: non c'è differenza. Un metodo di estensione è solo un metodo statico in una classe statica. Quindi puoi trattarlo come un normale metodo statico (questa risposta) o lo usi come metodo di estensione (la risposta di Ahmed). –

3

Se si vuole a tutti loro confrontare in un colpo solo:

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 entrambe le partite (si potrebbe probabilmente espanderlo per escludere elementi già abbinati suppongo)

+0

Grazie, probabilmente non lo userà questa volta, ma è un'opzione elegante. –

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