2013-02-08 12 views
35

Supponiamo che abbia una matrice .net di stringhe.Come rendere IEnumerable <string>. Contiene maiuscole e minuscole?

string[] strings = new string[] { "AbC", "123", "Xyz", "321" }; 

Se volevo vedere se l'array di stringhe contenente "ABC", ho potuto scrivere

strings.Contains("ABC"); 

Tuttavia, immagino che voglio una funzione che restituirà true se i valori maiuscoli del le stringhe contengono "ABC". Potrei scrivere in maiuscolo l'intero array, ma sembra che il metodo .Contains abbia alcuni sovraccarichi per specificare il confronto, ma sono confuso dalla sintassi.

Come utilizzare il metodo IEnumerable<string>.Contains() implementare questa logica?

+1

Vorrei sottolineare che so che posso scrivere 'strings.select (s => s.ToUpper) .Contains (" ABC ")', ma mi piacerebbe sapere se è possibile usare '.Contains' senza uppercasing dell'array. –

+1

Né si dovrebbe cambiare un involucro a causa di [The turkish i Problem] (http://haacked.com/archive/2012/07/05/turkish-i-problem-and-why-you-should-care.aspx/). –

risposta

70

Usa sovraccaricato Enumerable.Contains metodo che accetta l'uguaglianza di confronto:

strings.Contains("ABC", StringComparer.InvariantCultureIgnoreCase) 

Inoltre v'è strings comparer in scatola che è possibile utilizzare.

1

Personalmente, come questo ragazzo LambdaComparer, che è veramente utile per cose come questa:

LINQ Your Collections with IEqualityComparer and Lambda Expressions

Esempio di utilizzo:

var comparer = new LambdaComparer<string>(
    (lhs, rhs) => lhs.Equals(rhs, StringComparison.InvariantCultureIgnoreCase)); 

var seq = new[]{"a","b","c","d","e"}; 

Debug.Assert(seq.Contains("A", comparer)); 
0

Se per qualche motivo si sia preferisce o è costretti a utilizzare StringComparison e non StringComparer, è possibile aggiungere un metodo di estensione come segue:

public static bool Contains(this IEnumerable<string> items, string value, StringComparison stringComparison) 
{ 
    StringComparer stringComparer; 

    switch (stringComparison) 
    { 
     case StringComparison.CurrentCulture: 
      stringComparer = StringComparer.CurrentCulture; 
      break; 
     case StringComparison.CurrentCultureIgnoreCase: 
      stringComparer = StringComparer.CurrentCultureIgnoreCase; 
      break; 
     case StringComparison.InvariantCulture: 
      stringComparer = StringComparer.InvariantCulture; 
      break; 
     case StringComparison.InvariantCultureIgnoreCase: 
      stringComparer = StringComparer.InvariantCultureIgnoreCase; 
      break; 
     case StringComparison.Ordinal: 
      stringComparer = StringComparer.Ordinal; 
      break; 
     case StringComparison.OrdinalIgnoreCase: 
      stringComparer = StringComparer.OrdinalIgnoreCase; 
      break; 
     default: 
      throw new NotImplementedException(); 
    } 

    return items.Contains(value, stringComparer); 
} 

Altre varianti su come mappare queste possono essere trovate in this question.

Problemi correlati