![](/img/trans.png)
[英]Making a reusable predicate for EntitySet<T>, IQueryable<T> and IEnumerable<T>
[英]IEnumerable<T>.Contains with predicate
我只需要澄清给定的集合包含一个元素。
我可以通过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();
}
}
那么有没有其他方法可以使用谓词?
.Any(predicate)
听起来像你想要的; 返回bool
,一找到匹配就返回true
,否则返回false
。 还有:
.All(predicate)
其行为方式类似,一旦找到不匹配就返回false
,否则为true
。
您可以使用Any(predicate)
。 它将返回true或false,具体取决于谓词是否存在于某个集合中。
看一下IEnumerable<T>.Any
扩展。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.