2013-02-08 9 views
35

Załóżmy, że mam .net Array z ciągów.Jak zrobić IEnumerable <string>. Czy nie ma znaczenia wielkość liter?

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

Gdybym chciał sprawdzić, czy tablica łańcuchów zawiera „abc”, mógłbym napisać

strings.Contains("ABC"); 

Jednak załóżmy, że chcę funkcję, która zwróci true jeśli wielkie wartości ciągi zawierają "ABC". Mogłem wpisać wielką literę w całą tablicę, ale wygląda na to, że metoda .Contains ma pewne przeciążenia dla określenia porównania, ale jestem zdezorientowany przez składnię.

Jak korzystać z metody IEnumerable<string>.Contains() implementacji tej logiki?

+1

Pozwolę sobie podkreślić, że wiem, że mogę napisać 'strings.select (s => s.ToUpper) .Contains (" ABC ")', ale chciałbym wiedzieć, czy jest to możliwe za pomocą '.Contains' bez wyższą tablicę. –

+1

Nie powinieneś zmieniać żadnej obudowy z powodu [The turkish i Problem] (http://haacked.com/archive/2012/07/05/turkish-i-problem-and-why-you-should-care.aspx/). –

Odpowiedz

70

Zastosowanie przeciążony Enumerable.Contains metodę, która akceptuje porównywarka równości:

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

Ponadto istnieje strings comparer w oknie, które można wykorzystać.

1

ja osobiście jak ten facet LambdaComparer, co jest bardzo przydatne dla rzeczy takich jak to:

LINQ Your Collections with IEqualityComparer and Lambda Expressions

Przykład wykorzystania:

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

Jeśli z jakiegoś powodu albo wolą lub zmuszone są do użyj StringComparison, a nie StringComparer, możesz dodać metodę rozszerzenia w następujący sposób:

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

Więcej wariacji na temat mapowania można znaleźć pod numerem this question.

Powiązane problemy