LINQ:选择一个对象并更改一些属性而不创建新对象

271
我想要更改LINQ查询结果对象的某些属性,而不需要创建一个新对象并手动设置每个属性。这可能吗?
例如:
var list = from something in someList
           select x // but change one property

1
抱歉!这是正确的地址:https://robvolk.com/linq-select-an-object-but-change-some-properties-without-creating-a-new-object-af4072738e33 - Rob Volk
1
参见:https://stackoverflow.com/questions/47836019/linq-set-a-property-while-doing-a-projection?noredirect=1#47836189 - Revious
2
虽然可以这样做,正如答案所示,但请注意这违反了LINQ的本质。LINQ方法不应该引起副作用,因此这样做与最小惊讶原则不符。按照LINQ的原则,您应该获取对象,然后修改它们。 - Gert Arnold
14个回答

0
var item = (from something in someList
       select x).firstordefault();

可以获取item,然后您可以执行item.prop1=5;来更改特定属性。

或者,您是否希望从数据库中获取项目列表,并将返回的列表中每个项目的属性prop1更改为指定值? 如果是这样,您可以这样做(我使用VB进行操作,因为我更熟悉):

dim list = from something in someList select x
for each item in list
    item.prop1=5
next

list将包含所有带有您更改的项目)


虽然这样可以工作,但我认为OP想知道如何编写LINQ语句而不必编写“for each”循环。 - fujiiface

0

-1

我遇到了与OP问题完全相同的要求,但我没有看到任何在上面使用表达式回答的地方。

假设xMyType类型,你可以调用一个返回MyType并接受x的方法。在该方法内部,您可以进行所有想要的修改。代码将如下所示。

var list = from something in someList
           select GetModifiedObject(x); // but change one property

private MyType GetModifiedObject(MyType x)
{
   x.Property1 = "Changed Value";
   return x;
}

嗯,基本上这与被接受的答案和其他答案相同。 - Gert Arnold

-4
User u = UserCollection.Single(u => u.Id == 1);
u.FirstName = "Bob"

1
不需要复制此线程上的现有答案。如果您对该答案有评论,请在该答案下留言。 - KyleMit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接