2013-02-08 60 views
35

假設我有一個.net數組的字符串。如何使IEnumerable <string>。包含不區分大小寫?

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

如果我想看看,如果字符串數組包含「ABC」,我可以寫

strings.Contains("ABC"); 

然而,假設我想這將返回true的函數,如果的大寫值字符串包含「ABC」。我可以大寫整個數組,但它看起來像.Contains方法有一些重載指定比較,但我很困惑的語法。

如何使用IEnumerable<string>.Contains()方法實現這個邏輯?

+1

讓我強調,我知道我可以編寫'strings.select(s => s.ToUpper).Contains(「ABC」)',但我想知道是否可以使用'.Contains'大量數組。 – 2013-02-08 21:49:52

+1

也不應該因爲[土耳其我問題]改變任何套管(http://haacked.com/archive/2012/07/05/turkish-i-problem-and-why-you-should-care.aspx/ )。 – 2017-04-17 00:28:24

回答

70

使用重載Enumerable.Contains方法,它接受相等比較:

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

也有是在框中,您可以使用strings comparer

1

我個人很喜歡這個傢伙的LambdaComparer,這對於像這樣的東西真的有用:

LINQ Your Collections with IEqualityComparer and Lambda Expressions

實例應用:

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

如果由於某種原因,你要麼喜歡或被迫使用StringComparison而不是StringComparer,可以添加擴展方法如下:

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

有關如何映射這些的更多變體可在this question中找到。