【问题标题】:IEnumerable<T>.Contains with predicateIEnumerable<T>.Contains with predicate
【发布时间】:2011-03-20 17:11:24
【问题描述】:

我只需要澄清给定的集合包含一个元素。

我可以通过collection.Count(foo =&gt; foo.Bar == "Bar") &gt; 0) 做到这一点,但它会做不必要的工作 - 迭代整个集合,而我需要在第一次出现时停止。

但我想尝试将Contains() 与谓词一起使用,例如foo =&gt; foo.Bar == "Bar".

目前IEnumerable&lt;T&gt;.Contains有两个签名:

  • IEnumerable&lt;T&gt;.Contains(T)

  • IEnumerable&lt;T&gt;.Contains(T, IEqualityComparer&lt;T&gt;)

所以我必须指定一些变量来检查:

var collection = new List<Foo>() { foo, bar };
collection.Contains(foo);

或编写我的自定义IEqualityComparer&lt;Foo&gt;,它将用于我的收藏:

class FooComparer : IEqualityComparer<Foo>
{
    public bool Equals(Foo f1, Foo f2)
    {
        return (f1.Bar == f2.Bar); // my predicate
    }

    public int GetHashCode(Foo f)
    {
        return f.GetHashCode();
    }   
}

那么还有其他使用谓词的方法吗?

【问题讨论】:

    标签: c# linq ienumerable contains predicate


    【解决方案1】:

    您可以使用Any(predicate)。 根据谓词是否存在于某个集合中,它将返回 true 或 false。

    【讨论】:

      【解决方案2】:

      看看IEnumerable&lt;T&gt;.Any 扩展。

      【讨论】:

        【解决方案3】:
        .Any(predicate)
        

        听起来像你想要的;返回bool,一旦找到匹配项就返回true,否则返回false。还有:

        .All(predicate)
        

        其行为方式类似,一旦发现不匹配就返回false,否则返回true

        【讨论】:

          猜你喜欢
          • 2019-04-02
          • 2012-12-11
          • 2014-01-19
          • 1970-01-01
          • 2017-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多