IEnumerable<T>.Contains with predicate

Posted

技术标签:

【中文标题】IEnumerable<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();
       

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:
.Any(predicate)

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

.All(predicate)

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

【讨论】:

以上是关于IEnumerable<T>.Contains with predicate的主要内容,如果未能解决你的问题,请参考以下文章

无法将类型“IEnumerable<T>”隐式转换为“ActionResult<IEnumerable<T>>”

如何将多个 IEnumerable<IEnumerable<T>> 列表添加到 IEnumerable<List<int>>

c# IEnumerable<T>

IEnumerable<T>是啥意思?

返回 IEnumerable<T> 与 IQueryable<T>

返回 IEnumerable<T> 与 IQueryable<T>