IEnumerable<T>.Contains with predicate
Posted
技术标签:
【中文标题】IEnumerable<T>.Contains with predicate【英文标题】: 【发布时间】:2011-03-20 17:11:24 【问题描述】:我只需要澄清给定的集合包含一个元素。
我可以通过collection.Count(foo => foo.Bar == "Bar") > 0)
做到这一点,但它会做不必要的工作 - 迭代整个集合,而我需要在第一次出现时停止。
但我想尝试将Contains()
与谓词一起使用,例如foo => foo.Bar == "Bar"
.
目前IEnumerable<T>.Contains
有两个签名:
IEnumerable<T>.Contains(T)
IEnumerable<T>.Contains(T, IEqualityComparer<T>)
所以我必须指定一些变量来检查:
var collection = new List<Foo>() foo, bar ;
collection.Contains(foo);
或编写我的自定义IEqualityComparer<Foo>
,它将用于我的收藏:
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<T>.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>>