select new VS foreach(...)new之间有什么区别

时间:2016-01-25 14:55:44

标签: c# .net visual-studio visual-studio-2013 foreach

之间有什么区别吗?
 int i = 0;
 var myItems = (from source in datasource
                         select new MyObject
                         {
                             LabelId = i++,
                             Label = source.SourceName,
                             Data = source.TotalCount
                         }).ToList();

 int i = 0;
 List<MyObject> myItems = new List<MyObject>();
 foreach (var source in datasource)
        {
            MyObject myItem = new MyObject()
            {
                Label = item.SourceName,
                LabelId = i++,
                Data = item.TotalCount                
            };
            myItems.Add(myItem);
        }           

在处理性能/复杂性时间时?

3 个答案:

答案 0 :(得分:2)

简短的回答:没有,当你在第一个上调用ToList时没有,你立即强制迭代,因此会分配相同的内存。

唯一可能的差异是有机会通过select new { Label = ..., Data = ..., LabelID = i++ }匿名创建第一种方法中的实例。

答案 1 :(得分:2)

存在一些差异。

  1. 第一个稍微清楚一点。

  2. 对于某些数据源(链接到SQL是经典示例,但任何createDictionary数据源都可以执行此操作),select语句实际上不会以您期望的方式迭代集合。 select语句将被翻译成IQueryable可以理解的查询。根据您的数据源,这可以节省您和远程(SQL)之间的带宽,并可能允许更优化的查询。

  3. 如果没有立即调用IQueryProvider,在枚举结果之前不会发生任何事情。在某些情况下,这可以节省执行代码。有时候最好避免调用.ToList()来阻止n+1 problem。有时候最好调用.ToList(),例如当您需要多次迭代结果时。

  4. 此查询也可以写成:

    .ToList()

    我个人觉得更清楚,虽然这可能是一个品味问题。它确实具有从您的范围中删除var myItems = datasource.Select((i, item) => new MyObject { Label = item.SourceName, LabelId = i, Data = item.TotalCount }.ToList(); 变量的优势,这总是很好并且通常被认为是良好的做法。

答案 2 :(得分:0)

其中之一是select中的异常行,异常将告诉您select的行号,但是对于foreach,异常将为您提供真实的行号,在某些情况下,这对我来说是必须的。