linq 包含字符串比较。 IEqualityComparer

时间:2021-05-25 12:53:12

标签: c# linq string-comparison

我想知道一个确定的字符串是否在字符串列表中,符合 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); 的最简洁方法是什么?

2 个答案:

答案 0 :(得分:1)

要么使用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 不支持这两种方式。

答案 1 :(得分:1)

您有多种选择。

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

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

(在可能的情况下使用静态 string.Equals(string, string) 更安全,因为 null 的任一参数都是安全的)。

Linq 还提供了 Contains 的重载,它采用 IEqualityComparer<T>,您可以将 StringComparer.InvariantCultureIgnoreCase 传递给:

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

See here

相关问题