假设我有一个.net数组字符串。
string[] strings = new string[] { "AbC", "123", "Xyz", "321" };
如果我想查看字符串数组是否包含“ABC”,我可以写
strings.Contains("ABC");
但是,假设我想要一个函数,如果字符串的大写值包含“ABC”,它将返回true。我可以大写整个数组,但看起来.Contains
方法有一些重载来指定比较,但我对语法感到困惑。
我怎样才能使用IEnumerable<string>.Contains()
方法实现这个逻辑?
使用重载的Enumerable.Contains方法接受相等比较器:
strings.Contains("ABC", StringComparer.InvariantCultureIgnoreCase)
你也可以使用盒子里的strings comparer。
我个人喜欢这个人的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));
如果由于某种原因你喜欢或被迫使用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中找到。