var groupedItems = items.GroupBy(i => i.Value)
.Select(x => new Item(x.First().Name, x.Key));
Here, groupedItems
实际上并没有容纳任何物品。这IEnumerable<T>
由返回Select
代表一个计算——准确的说,代表的是映射的结果items
通过应用函数到一组新的项目x => new Item(x.First().Name, x.Key)
.
每次迭代时groupedItems
,将应用该函数并创建一组新的项目。
var groupedItems = items.GroupBy(i => i.Value)
.Select(x =>
{
Console.WriteLine("Creating new item");
return new Item(x.First().Name, x.Key));
}
foreach(var item in groupedItems);
foreach(var item in groupedItems);
例如,此代码将为中的每个项目打印两次“Creating new item”items
.
在您的代码中,您正在设置CalculatedValue
of an 短暂的物品。当 foreach 循环完成后,这些项目就消失了。
通过致电ToList
,您将“计算”转变为实际的项目集合。
而不是打电话ToList
,您也可以创建另一种计算代表一组新的项目及其CalculatedValue
属性集。这是功能性的 way.
Func<Item, Item> withCalculatedValue =
item => {
item.CalculatedValue = item.Name + item.Value;
return item;
};
return items.GroupBy(i => i.Value)
.Select(x => new Item(x.First().Name, x.Key))
.Select(withCalculatedValue);
或者简单地使用对象初始值设定项
return items.GroupBy(i => i.Value)
.Select(x => new Item(x.First().Name, x.Key) { CalculatedValue = x.First().Name + x.Key });
如果您想对进行计算的对象主题进行更多研究,请搜索术语“Monad”,但要做好被混淆的准备。