6

我想我不太了解 LINQ。我想要做:

foreach (MyObjetc myObject in myObjectCollection)
{
    myObjet.MyProperty = newValue
}

只需更改我收藏的所有元素中某个属性的所有值。

使用 LINQ 不会是这样吗?

myObjectCollection.Select(myObject => myObject.MyProperty = newValue)

它不起作用。属性值没有改变。为什么?

编辑:

对不起大家。当然,foreach 是正确的方法。但是,就我而言,我必须在许多集合中重复 foreach,而且我不想重复循环。所以,最后,我找到了一个“中间”解决方案,“foreach”方法,类似于“选择”:

myObjectCollection.ForEach(myObject => myObject.MyProperty = newValue)

无论如何,它可能不像更简单的那样清楚:

foreach (MyObjetc myObject in myObjectCollection) myObjet.MyProperty = newValue;
4

2 回答 2

8

首先,这不是一个好主意。反对它的论点见下文。

它不起作用。属性值没有改变。为什么?

它不起作用,因为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”与“ForEach”

于 2013-11-14T00:19:58.073 回答
0

正如sircodesalot 提到的,你不能使用linq 来做这样的事情。请记住,linq 是一种查询语言,这意味着您所能做的就是查询它。进行更改必须在其他逻辑中完成。

你可以做什么,如果你不想做第一种方式,如果你的集合已经是一个列表(但不是 IEnumerable),你可以使用 linq 中的 ForEach 扩展方法来做你所要求的。

我应该提到的另一点是 Select 方法对某些特定信息进行投影以返回到 IEnumerable。因此,如果您只想从集合中获取特定属性,则可以使用它。这就是它所做的一切。

于 2013-11-14T00:20:25.513 回答