我想我并没有很好地承担LINQ。我想这样做:
foreach (MyObjetc myObject in myObjectCollection)
{
myObjet.MyProperty = newValue
}
只需更改集合中所有元素的属性的所有值。
使用LINQ不是这样的吗?
myObjectCollection.Select(myObject => myObject.MyProperty = newValue)
它不起作用。属性值不会更改。为什么呢?
修改
对不起,伙计们。当然,foreach是正确的方法。但是,在我的情况下,我必须在许多集合中重复foreach,我不想重复循环。所以,最后,我找到了一个''中间'解决方案,'foreach'方法,就像'Select'一样:
myObjectCollection.ForEach(myObject => myObject.MyProperty = newValue)
无论如何,它可能不像更简单的那样清晰:
foreach (MyObjetc myObject in myObjectCollection) myObjet.MyProperty = newValue;
答案 0 :(得分:7)
首先,这不是一个好主意。请参阅下面的反对意见。
它不起作用。属性值不会更改。为什么呢?
它不起作用,因为Select()
实际上没有迭代整个集合,直到你枚举它的结果,并且它需要一个计算结果为值的表达式。
如果你让你的表达式返回一个值,并添加一些能够完全评估查询的东西,比如ToList()
,那么它将“起作用”,即:
myObjectCollection.Select(myObject => { myObject.MyProperty = newValue; return myObject;}).ToList();
话虽这么说,ToList()
有一些缺点 - 主要是,它做了很多额外的工作(创建List<T>
),这是不需要的,这增加了很多成本。避免它需要枚举集合:
foreach(var obj in myObjectCollection.Select(myObject => { myObject.MyProperty = newValue; return myObject; }))
{ }
同样,我不推荐这个。此时,Select
选项更加丑陋,打字更多等等。这也违反了LINQ所涉及的期望 - LINQ是关于查询的,这表明不应该是副作用使用LINQ时,这里的全部目的是创建副作用。
但是,在这一点上,你最好(打字更少)以“清晰”的方式做到这一点:
foreach (var obj in myObjectCollection)
{
obj.MyProperty = newValue;
}
这个更短,更清晰,非常清晰。
请注意,您可以添加ForEach<T>
扩展方法,该方法对每个对象执行操作,但我仍然建议您避免这种情况。 Eric Lippert写了一篇很棒的博客文章,关于这个主题值得一读:"foreach" vs "ForEach"。
答案 1 :(得分:0)
正如sircodesalot所提到的,你不能用linq做那样的事情。请记住,linq是一种查询语言,这意味着你所能做的就是查询它。必须在其他逻辑中进行更改。
你可以做什么,如果你不想以第一种方式去做,如果你的集合已经是一个列表(但不是IEnumerable),你可以在linq中使用ForEach扩展方法做你要求的
我要提到的另一点是,Select方法会对某些特定信息进行投影以返回IEnumerable。因此,如果您只想从集合中获取特定属性,则可以使用该属性。就是这样。