2013-02-08 4 views
35

Angenommen, ich habe ein .net Array von Strings.Wie IEnumerable <string> machen. Enthält Groß-und Kleinschreibung nicht?

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

Wenn ich, wenn das Array von Strings sehen wollte enthält „ABC“, konnte ich

strings.Contains("ABC"); 

jedoch schreiben, nehme an, dass ich eine Funktion wollen, dass dann, wenn die Groß Werte der zurück Zeichenketten enthalten "ABC". Ich könnte das gesamte Array in Großbuchstaben schreiben, aber es sieht so aus, als hätte die Methode .Contains einige Überladungen, um den Vergleich zu spezifizieren, aber ich bin von der Syntax verwirrt.

Wie kann ich die IEnumerable<string>.Contains() Methode implementieren diese Logik?

+1

Lassen Sie mich betonen, dass ich weiß, dass ich 'strings.select (s => s.ToUpper). Contains (" ABC ") schreiben kann, aber ich würde gerne wissen, ob es möglich ist,' .Contains' ohne zu verwenden das Array hochstellen. –

+1

Sie sollten auch kein Gehäuse ändern wegen [The turkish i Problem] (http://haacked.com/archive/2012/07/05/turkish-i-problem-und-why-you-should-care.aspx/). –

Antwort

70

Nutzung überlastet Enumerable.Contains Methode, die Gleichheitsvergleich akzeptiert:

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

Auch ist es strings comparer in-Box, die Sie verwenden können.

1

Mir persönlich gefällt dieser Typ LambdaComparer, der die für Sachen wie diese wirklich nützlich ist:

LINQ Your Collections with IEqualityComparer and Lambda Expressions

Verwendungsbeispiel:

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

Wenn aus irgendeinem Grund entweder Sie es vorziehen, oder gezwungen sind, Verwenden Sie StringComparison und nicht StringComparer, können Sie eine Erweiterungsmethode wie folgt hinzufügen:

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

Weitere Variationen, wie diese zu kartieren sind, finden Sie in this question.

Verwandte Themen