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

时间:2013-02-08 21:46:52

标签: .net arrays string linq

假设我有一个.net数组字符串。

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

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

strings.Contains("ABC");

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

如何使用IEnumerable<string>.Contains()方法实现此逻辑?

3 个答案:

答案 0 :(得分:86)

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

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

您也可以使用框中的strings comparer

答案 1 :(得分: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));

答案 2 :(得分: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中找到。