使用LINQ,如果我想执行一些查询并从查询中返回对象,但只更改该对象中的某些属性,如何在不创建新对象的情况下执行此操作并手动设置每个属性?这可能吗?
例:
var list = from something in someList
select x // but change one property
Run Code Online (Sandbox Code Playgroud)
Jar*_*Par 360
我不确定查询语法是什么.但这是扩展的LINQ表达式示例.
var query = someList.Select(x => { x.SomeProp = "foo"; return x; })
Run Code Online (Sandbox Code Playgroud)
这样做是使用匿名方法vs和表达式.这允许您在一个lambda中使用多个语句.因此,您可以组合设置属性的两个操作,并将对象返回到这个有点简洁的方法中.
Jon*_*kes 57
如果您只想更新所有元素的属性,那么
someList.All(x => { x.SomeProp = "foo"; return true; })
Run Code Online (Sandbox Code Playgroud)
Jan*_*ník 31
我更喜欢这个.它可以与其他linq命令结合使用.
from item in list
let xyz = item.PropertyToChange = calcValue()
select item
Run Code Online (Sandbox Code Playgroud)
Jos*_*den 21
应该没有任何LINQ魔法阻止你这样做.虽然这将返回匿名类型,但不要使用投影.
User u = UserCollection.FirstOrDefault(u => u.Id == 1);
u.FirstName = "Bob"
Run Code Online (Sandbox Code Playgroud)
这将修改真实对象,以及:
foreach (User u in UserCollection.Where(u => u.Id > 10)
{
u.Property = SomeValue;
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*ner 10
标准查询运算符是不可能的 - 它是语言集成查询,而不是语言集成更新.但您可以在扩展方法中隐藏更新.
public static class UpdateExtension
{
public static IEnumerable<Car> ChangeColorTo(
this IEnumerable<Car> cars, Color color)
{
foreach (Car car in cars)
{
car.Color = color;
yield return car;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以按如下方式使用它.
cars.Where(car => car.Color == Color.Blue).ChangeColorTo(Color.Red);
Run Code Online (Sandbox Code Playgroud)
如果你想用Where
子句更新项目,如果你这样做,使用 .Where(...) 将截断你的结果:
list = list.Where(n => n.Id == ID).Select(n => { n.Property = ""; return n; }).ToList();
Run Code Online (Sandbox Code Playgroud)
您可以对列表中的特定项目进行更新,如下所示:
list = list.Select(n => { if (n.Id == ID) { n.Property = ""; } return n; }).ToList();
Run Code Online (Sandbox Code Playgroud)
即使您不进行任何更改,也始终退回商品。这样它就会被保留在列表中。
归档时间: |
|
查看次数: |
225514 次 |
最近记录: |