使用谓词的IEnumerable<T>.Contains

37

我需要澄清的是,给定的集合中是否包含一个元素。

我可以通过 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();
    }   
}

那么还有其他使用谓词的方法吗?
3个回答

75
.Any(predicate)

这似乎是你想要的,返回bool类型,一旦找到匹配项就返回true,否则返回false。此外还有:

.All(predicate)

它的行为类似,一旦找到一个不匹配的项就返回false,否则返回true


8
你可以使用 Any(predicate)。它将根据谓词在特定集合中是否存在返回true或false。

8

看一下 IEnumerable<T>.Any 扩展方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接