2014-04-28 11 views
7

i seguenti controlli se tutti i valori in un array di stringhe sono uguali ignorando il casoCome controllare se tutti i valori di un array sono uguali

string [] StringArray = new string[]{"xxx","xXx","Xxx"}; 
bool ValuesAreEqual = false; 
for(int i= 0;i<StringArray.Length;i++) 
{ 
    if(i>=1) 
    { 
     ValuesAreEqual = StringArray[0].Equals(StringArray[i],StringComparison.InvariantCultureIgnoreCase); 
     if(!ValuesAreEqual) 
     { 
      break; 
     } 
    } 
} 

Come avrei potuto scrivere questo utilizzando LINQ?

+0

Provare a utilizzare il '.All' estensione – vandango

+2

Credo' "xxx, xxx, xxx" '' dovrebbe essere "xxx", "xXx", "xXX" ' – sloth

+0

@DominicKexel grazie corresse – FPGA

risposta

8

Se vuoi sapere se tutti sono uguali Enumerable.All è efficiente e leggibile:

string firstItem = StringArray[0]; 
bool allEqual = StringArray.Skip(1) 
    .All(s => string.Equals(firstItem, s, StringComparison.InvariantCultureIgnoreCase)); 

All rompe anche al primo confronto che restituisce false. Si noti che ho usato la statica string.Equals per evitare eccezioni nullo di riferimento sul null oggetti.

Tra l'altro, il ciclo non è corretto in quanto si comincia a confrontare all'indice 2 invece di 1 qui:

if(i > 1) // indices are zero based 
{ 
    // ... 
} 
+0

Ma se x = z e x = y = z allora y – FPGA

+0

@FPGA: scusate, non seguono. –

+1

loop è corretta, è '> =' :) –

1
bool areEqual = stringArray.Any() 
        ? stringArray.All(str => str.Equals(stringArray[0], StringComparison.InvariantCultureIgnoreCase)) 
        : true; 
+0

Due nitpicks: 1.) genera un 'NullReferenceException' se l'array contiene null, 2) è un po 'meno di quella effettuata prima stringa una variabile dal momento che ogni volta deve essere controllato se '0' è un indice valido. –

+0

@TimSchmelter Vero, ma la tua risposta risolve già questi problemi. Se dovessi fissare la mia risposta, sarebbe assomigliare copiavo vostro :) Tra l'altro, il vostro sarà anche lanciare un 'ArgumentOutOfRangeException' se la matrice è 0 lunghezza. – dcastro

2
string[] StringArray = new string[] {"xxx,xXx,Xxx"}; 
bool areEqual = StringArray.Select(s => s.ToLower()).Distinct().Count()==1; 

bool areEqual = StringArray.GroupBy(s => s.ToLower()).Count() == 1; 

solo per essere originale qui :)

+0

Forse il tuo codice manca qualcosa? :-) – sloth

+0

sì, 'Distinto()';) Grazie amico – Andrew

2
string[] StringArray = new string[] { "xxx","xXx","Xxx" }; 

var item = StringArray.FirstOrDefault(); 
bool match = StringArray.Skip(1).All(i => i.ToLower() == item.ToLower()); 
Problemi correlati