linq 包含字符串比较。 IE质量比较器

linq contains string comparison. IEqualityComparer

我想知道确定字符串是否在字符串列表中,符合 StringComparison.InvariantCultureIgnoreCase 条件。所以我尝试了类似的东西:

bool isInList = _myList.Contains(toFindString, StringComparison.InvariantCultureIgnoreCase);

或:

bool isInList = _myList.Contains(listElement => listElement .Equals(toFindString,StringComparison.InvariantCultureIgnoreCase));

但是,Contains 方法不包含 Func<TSource, bool> predicate 重载,我认为这对于这种情况是最干净的。例如 WhereCount 方法得到它。

Count 的重载方法签名:

public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

我的案例的具体应用:

int foundCount = _myList.Count(listElement => listElement.Equals(toFindString, StringComparison.InvariantCultureIgnoreCase));

StringComparison.InvariantCultureIgnoreCase 标准添加到 linq Contains 电流过载的最干净的方法是什么 IEqualityComparer 就是这个 public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer);?

或者使用StringComparer.InvariantCultureIgnoreCase

bool isInList = _myList.Contains(toFindString, StringComparer.InvariantCultureIgnoreCase);

或使用 AnyStringComparison:

bool isInList = _myList.Any(s => s.Equals(toFindString,StringComparison.InvariantCultureIgnoreCase));

如果列表中有 null 个字符串,后者会出现问题,因此您可以使用 string.Equals.

请注意,Linq-To-Entities 不支持这两种方式。

您有多种选择。

第一种是使用 Enumerable.Any,并使用 string.Equals 重载测试每个元素,该重载采用 StringComparison:

bool isInList = _myList.Any(x => string.Equals(x, "A", StringComparison.InvariantCultureIgnoreCase));

(尽可能使用静态 string.Equals(string, string) 更安全,因为任何一个参数都是 null 都是安全的)。

Linq 还提供了 Contains which takes an IEqualityComparer<T>, which you can pass StringComparer.InvariantCultureIgnoreCase 的重载到:

bool isInList = _myList.Contains("A", StringComparer.InvariantCultureIgnoreCase);

See here.