Linq更快,更慢还是一样?

Vac*_*ano 5 c# linq performance

这是:

Box boxToFind = AllBoxes.FirstOrDefault(box => box.BoxNumber == boxToMatchTo.BagNumber);
Run Code Online (Sandbox Code Playgroud)

比这更快或更慢:

Box boxToFind ;
foreach (Box box in AllBoxes)
{
    if (box.BoxNumber == boxToMatchTo.BoxNumber)
    {
        boxToFind = box;
    }
}
Run Code Online (Sandbox Code Playgroud)

两者都给了我正在寻找的结果(boxToFind).这将在我需要表现良好的移动设备上运行.

SLa*_*aks 8

它应该大致相同,除了你需要调用First(或匹配你的代码Last),而不是Where.
通话Where会给你一套匹配的项目(一IEnumerable<Box>); 你只想要一个匹配的项目.

通常,在使用LINQ时,您需要了解延迟执行.在您的特定情况下,它是无关紧要的,因为您获得了单个项目.

  • @hunter:除非他想要一个例外. (11认同)
  • @SLaks 或者知道一个合适的元素总是存在。 (2认同)

Sam*_*eff 8

除非您通过性能分析确定此特定循环是性能瓶颈,否则差异并不重要.

如果分析确实发现它是一个问题,那么您将需要查看备用存储.将数据存储在字典中,该字典提供比循环数组更快的查找.

  • @Rubys - 字典查找是O(1),迭代遍历数组是O(n)所以字典查找对于足够大的集合来说更快(假设一个合理的散列函数). (5认同)
  • @Rubys:我觉得你有点混淆了.访问数组中已知索引处的项目的速度和获取速度一样快,是的.*枚举*在数组上*找到*该索引*不*快.字典通过利用散列函数来尝试绕过慢速部分(枚举)并直接跳转到快速部分(通过索引访问)来工作. (2认同)