我想改变一个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
当前回答
使用ForEach
var list = from something in someList;
list.ForEach(x => x.Property = value);
其他回答
不应该有任何LINQ魔法阻止你这样做。不要使用投影,那会返回一个匿名类型。
User u = UserCollection.FirstOrDefault(u => u.Id == 1);
u.FirstName = "Bob"
这将修改真实对象,以及:
foreach (User u in UserCollection.Where(u => u.Id > 10)
{
u.Property = SomeValue;
}
这对于标准查询操作符是不可能的——它是语言集成查询,而不是语言集成更新。但是您可以将更新隐藏在扩展方法中。
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;
}
}
}
现在您可以像下面这样使用它。
cars.Where(car => car.Color == Color.Blue).ChangeColorTo(Color.Red);
如果你想用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();
总是返回项目,即使你不做任何改变。这样它将被保存在列表中。
这是最简单的解决方案: 列表。其中(t => t. id == 1). tolist()。ForEach(t => t. property = "something");
尝试和工作,引用于此: https://visualstudiomagazine.com/articles/2019/07/01/updating-linq.aspx
我遇到了确切的要求(OP的问题),我没有看到在任何地方用表达来回答。
假设x是MyType类型,您可以调用一个返回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;
}