之间有什么区别吗?
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);
}
在处理性能/复杂性时间时?
答案 0 :(得分:2)
简短的回答:没有,当你在第一个上调用ToList
时没有,你立即强制迭代,因此会分配相同的内存。
唯一可能的差异是有机会通过select new { Label = ..., Data = ..., LabelID = i++ }
匿名创建第一种方法中的实例。
答案 1 :(得分:2)
存在一些差异。
第一个稍微清楚一点。
对于某些数据源(链接到SQL是经典示例,但任何createDictionary
数据源都可以执行此操作),select语句实际上不会以您期望的方式迭代集合。 select语句将被翻译成IQueryable
可以理解的查询。根据您的数据源,这可以节省您和远程(SQL)之间的带宽,并可能允许更优化的查询。
如果没有立即调用IQueryProvider
,在枚举结果之前不会发生任何事情。在某些情况下,这可以节省执行代码。有时候最好避免调用.ToList()
来阻止n+1 problem。有时候最好调用.ToList()
,例如当您需要多次迭代结果时。
此查询也可以写成:
.ToList()
我个人觉得更清楚,虽然这可能是一个品味问题。它确实具有从您的范围中删除var myItems = datasource.Select((i, item) => new MyObject
{
Label = item.SourceName,
LabelId = i,
Data = item.TotalCount
}.ToList();
变量的优势,这总是很好并且通常被认为是良好的做法。
答案 2 :(得分:0)
其中之一是select中的异常行,异常将告诉您select的行号,但是对于foreach,异常将为您提供真实的行号,在某些情况下,这对我来说是必须的。