【问题标题】:linq contains string comparison. IEqualityComparerlinq 包含字符串比较。 IEqualityComparer
【发布时间】:2021-05-25 12:53:12
【问题描述】:

我想知道确定字符串是否在字符串列表中,具有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&lt;TSource&gt;(this IEnumerable&lt;TSource&gt; source, TSource value, IEqualityComparer&lt;TSource&gt; comparer); 的最干净的方法是什么?

【问题讨论】:

  • _myList.Any(x =&gt; string.Equals(x, toFindString, StringComparison.InvariantCultureIgnoreCase)?
  • 呜呜这有点道理,在Any 中,重载可用...
  • 还有Enumerable.Contains 确实需要IEqualityComparer,应该可以正常工作
  • 但是有了IEqualityComparer,你必须创建一个实现接口的类并将其传入,不是吗?

标签: c# linq string-comparison


【解决方案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&lt;T&gt;,您可以将StringComparer.InvariantCultureIgnoreCase 传递给:

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

See here.

【讨论】:

    【解决方案2】:

    要么使用StringComparer.InvariantCultureIgnoreCase

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

    或将AnyStringComparison 一起使用:

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

    如果列表中有null-strings,后者有问题,所以你可以使用string.Equals

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多