2013-02-08 58 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中找到。