IEnumerable<T>.Contains with predicate

五迷三道 提交于 2019-12-08 14:26:28

问题


I need just to clarify that given collection contains an element.

I can do that via collection.Count(foo => foo.Bar == "Bar") > 0) but it will do the unnecessary job - iterate the whole collection while I need to stop on the first occurrence.

But I want to try to use Contains() with a predicate, e.g. foo => foo.Bar == "Bar".

Currently IEnumerable<T>.Contains has two signatures:

  • IEnumerable<T>.Contains(T)

  • IEnumerable<T>.Contains(T, IEqualityComparer<T>)

So I have to specify some variable to check:

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

or write my custom IEqualityComparer<Foo> which will be used against my collection:

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();
    }   
}

So are there any other methods to use predicate?


回答1:


.Any(predicate)

sounds like what you want; returns bool, returning true as soon as a match is found, else false. There is also:

.All(predicate)

which behaves in a similar way, returning false as soon as a non-match is found, else true.




回答2:


Have a look at the IEnumerable<T>.Any extension.




回答3:


You can use Any(predicate). It will return true or false depending if the predicate exists in a certain collection.



来源:https://stackoverflow.com/questions/3328760/ienumerablet-contains-with-predicate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!