检查是IEnumerable <t>有5个或更多匹配

时间:2016-12-15 19:55:33

标签: c# linq lambda count

我有一个IEnumerable,其中T是一个复杂的对象。我需要检查并查看列表中是否有5个或更多项与lambda表达式匹配。目前我正在使用这样的东西:

if(myList.Count(c=> c.PropertyX == desiredX && c.Y != undesiredY) >= 5)...

然而,我的myList增长到包含10K +对象,这变成了一个巨大的瓶颈,而且很可能它会在前100个项目中找到匹配(但我无法做出这样的假设)。

如何尽可能高效地完成这项工作。

3 个答案:

答案 0 :(得分:3)

您可以使用Where过滤,然后Skip前4个匹配,并使用Any,一旦达到第5场比赛,将停止迭代。匹配少于5次的情况仍然需要迭代整个列表。

if(myList.Where(c=> c.PropertyX == desiredX && c.Y != undesiredY).Skip(4).Any())

答案 1 :(得分:2)

如何使用普通的旧for循环遍历列表?:

int count = 0;
for (int i = 0; i < myList.Count; ++i)
{
    if (myList[i].PropertyX == desiredX && myList[i].Y != undesiredY)
       count++;

    if (count == 5)
       break;
}

这应该与单个线程上的速度一样快。由于您不能在列表中对这些项目进行任何假设,因此算法的时间复杂度不会优于O(n),其中n是列表中项目的数量,即在最坏的情况下您可能需要迭代整个列表的场景。并且没有比使用我知道的for循环更快地迭代列表的方法:)

答案 2 :(得分:1)

您可以使用Skip 4个元素并检查您的集合是否包含任何其他元素。这样你就不会计算集合中的所有元素。

var result = myList.Where(c=>c.PropertyX == desiredX && c.Y != undesiredY);

if(result.Skip(4).Any())
{
    //has >= 5 elements.
}