我有一个Car
对象,其ResaleValue
属性,我将这些汽车对象的集合存储在:
IEnumerable<Car>
我还有一个带有计算方法的ResaleCalculator()。
在linq中是否有办法应用计算并在没有循环的情况下设置集合中每个对象的ResaleValue
属性?
答案 0 :(得分:14)
你真的不想为此使用LINQ。首先,你没有避免循环,你只是将它抽象出来。其次,LINQ方法旨在过滤和/或投射序列,而不是使其变异。虽然您可以使用.ForEach
上的List<T>
实例方法来明确地编写循环,但是简单地编写循环来执行您需要它执行的操作几乎不清楚。
答案 1 :(得分:2)
我认为这会做你想做的事情
cars.Select(c=>c.ResaleValue = c.Calculate());
答案 2 :(得分:1)
如果不将新的IEnumerable投影到设置为IEnumerable<T>
属性的值并复制现有属性,则无法修改ResaleValue
。理想情况下,当您第一次获得IEnumerable<Car>
时,您会这样做。
IEnumerable<Car> cars = // however you set cars originally
cars = cars.Select(c => new Car
{
Prop1 = c.Prop1,
Prop2 = c.Prop2,
ResaleValue = ResaleCalculator(params)
});
显然这不太理想。另一方面,您可以ToList()
收集并使用ForEach
方法或常规foreach
循环:
var list = cars.ToList()
.ForEach(c => c.ResaleValue = ResaleCalculator(c.SomeNeededParam));