我想改变一个LINQ查询结果对象的一些属性,而不需要创建一个新的对象和手动设置每个属性。这可能吗?
例子:
var list = from something in someList
select x // but change one property
我想改变一个LINQ查询结果对象的一些属性,而不需要创建一个新的对象和手动设置每个属性。这可能吗?
例子:
var list = from something in someList
select x // but change one property
当前回答
如果你想用Where子句更新项,使用.Where(…)将截断你的结果:
list = list.Where(n => n.Id == ID).Select(n => { n.Property = ""; return n; }).ToList();
你可以像这样更新列表中的特定项目:
list = list.Select(n => { if (n.Id == ID) { n.Property = ""; } return n; }).ToList();
总是返回项目,即使你不做任何改变。这样它将被保存在列表中。
其他回答
由于我在这里没有找到我认为最好的解决方案的答案,下面是我的方法:
使用“选择”来修改数据是可能的,但只是有一个技巧。总之,"选择"不是为这个设计的。它只在与“ToList”一起使用时执行修改,因为Linq在需要数据之前不会执行。 无论如何,最好的解决方案是使用“foreach”。在下面的代码中,你可以看到:
class Person
{
public int Age;
}
class Program
{
private static void Main(string[] args)
{
var persons = new List<Person>(new[] {new Person {Age = 20}, new Person {Age = 22}});
PrintPersons(persons);
//this doesn't work:
persons.Select(p =>
{
p.Age++;
return p;
});
PrintPersons(persons);
//with "ToList" it works
persons.Select(p =>
{
p.Age++;
return p;
}).ToList();
PrintPersons(persons);
//This is the best solution
persons.ForEach(p =>
{
p.Age++;
});
PrintPersons(persons);
Console.ReadLine();
}
private static void PrintPersons(List<Person> persons)
{
Console.WriteLine("================");
foreach (var person in persons)
{
Console.WriteLine("Age: {0}", person.Age);
;
}
}
}
在"foreach"之前,你也可以做一个linq选择…
我更喜欢这个。它可以与其他linq命令组合使用。
from item in list
let xyz = item.PropertyToChange = calcValue()
select item
User u = UserCollection.Single(u => u.Id == 1);
u.FirstName = "Bob"
这是最简单的解决方案: 列表。其中(t => t. id == 1). tolist()。ForEach(t => t. property = "something");
尝试和工作,引用于此: https://visualstudiomagazine.com/articles/2019/07/01/updating-linq.aspx
使用ForEach
var list = from something in someList;
list.ForEach(x => x.Property = value);