如何使 IEnumerable<string>。是否不区分大小写?



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

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

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

strings.Contains("ABC");

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

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

使用重载的Enumerable。包含接受相等比较器的方法:

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

盒子里还有一个字符串比较器,你们可以使用。

我个人喜欢这家伙的LambdaComparer,它对这样的东西非常有用

LINQ您的收藏与IEqualityComparer和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));

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

关于如何绘制这些地图的更多变化可以在这个问题中找到。

相关内容

  • 没有找到相关文章

最新更新