代码之家  ›  专栏  ›  技术社区  ›  cllpse

LINQ查询上的Slow foreach()—ToList()极大地提高了性能—为什么会这样?

  •  11
  • cllpse  · 技术社区  · 14 年前

    我有点理解延迟执行的概念,但是下面的问题让我很困惑。。。

    在包含大约1000行的数据表上,我调用 可计算() (1) 其中() (2) ... 而且非常慢。

    1. DataTable.AsEnumerable().Select(r => new ObjectRepresentation { ... });
    2. item.Where(i => i.SomeEnum == SomeEnum.Something)


    ... 但如果我打电话 ToList() 可计算() 调用DataTable时,foreach循环只需不到一秒钟就可以完成。

    可计算() 其中() 拜访收藏品?还是以上所有的?


    更新

    public class ObjectRepresentation
    {
        public SomeEnum SomeEnum { get; set; }
    }
    
    
    var collection = DataTable.AsEnumerable().Select(r => new ObjectRepresentation
    {
        SomeEnum = (SomeEnum)Convert.ToInt32(r["SomeEnum"])
    });
    
    foreach(var item in collection) // slow loop
    {
        // 10 or so Where() calls on item inside this loop
    }
    
    collection = collection.ToList(); // Hit hyper speed button!
    
    foreach(var item in collection) // fast loop
    {
        // 10 or so Where() calls on item inside this loop
    }
    
    3 回复  |  直到 14 年前
        1
  •  9
  •   NetSide    14 年前

    在您键入之前,它不会从数据库中获取所有项

     ToList or First or Single
    

        2
  •  12
  •   Amy B    9 年前

    您不了解哪些方法是延迟的,哪些不是,所以您不了解代码何时定义操作,何时执行操作。

    这些都推迟了。它们定义但不执行操作。

    source.AsEnumerable
    source.Select
    source.Where
    

    它们枚举源,因此不会延迟。

    source.ToList
    source.First
    source.Single
    foreach(var x in source)
    
        3
  •  0
  •   peSHIr    14 年前

    实际上,您似乎不清楚什么是代码的执行,以及在实际使用结果时(可能)稍后执行的意图的定义。我建议读一下LINQ的这一部分。