我有一个IEnumerable,其中T是一个复杂的对象。我需要检查并查看列表中是否有5个或更多项与lambda表达式匹配。目前我正在使用这样的东西:
if(myList.Count(c=> c.PropertyX == desiredX && c.Y != undesiredY) >= 5)...
然而,我的myList增长到包含10K +对象,这变成了一个巨大的瓶颈,而且很可能它会在前100个项目中找到匹配(但我无法做出这样的假设)。
如何尽可能高效地完成这项工作。
答案 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.
}