如何使IEnumerable<string>.Contains不区分大小写?

70
假设我有一个包含字符串的 .net 数组。
string[] strings = new string[] { "AbC", "123", "Xyz", "321" };

如果我想查看字符串数组中是否包含“ABC”,我可以编写

strings.Contains("ABC");

然而,假设我想要一个函数,如果字符串的大写值包含"ABC"将返回true。 我可以将整个数组转换为大写,但是看起来.Contains方法有一些重载以指定比较方式,但是语法让我感到困惑。

我该如何使用IEnumerable<string>.Contains()方法实现这一逻辑?


2
让我强调一下,我知道我可以写strings.select(s => s.ToUpper).Contains("ABC"),但我想知道是否可能在不将数组转换为大写的情况下使用.Contains - Vivian River
1
你也不应该因为土耳其语的问题而改变任何大小写(参考链接:http://haacked.com/archive/2012/07/05/turkish-i-problem-and-why-you-should-care.aspx/)。 - Erik Philips
3个回答

143

使用重载的Enumerable.Contains方法,该方法接受相等比较器:

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

另外,框中还有您可以使用的字符串比较器


2
我个人喜欢这位作者的 LambdaComparer,它在像这样的任务中非常有用:
使用示例: 使用IEqualityComparer和Lambda表达式对你的集合进行LINQ查询
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));

1
如果由于某种原因,您更喜欢或被迫使用 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);
}

如何映射这些的更多变化可以在这个问题中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接