我想改变一个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
当前回答
User u = UserCollection.Single(u => u.Id == 1);
u.FirstName = "Bob"
其他回答
如果你只是想更新所有元素的属性,那么
someList.All(x => { x.SomeProp = "foo"; return true; })
不应该有任何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;
}
User u = UserCollection.Single(u => u.Id == 1);
u.FirstName = "Bob"
在不创建新对象的情况下,我们经常会遇到这种情况,即在列表中包含索引值和第一个和最后一个指标。这允许您知道项在列表、枚举等中的位置,而不必修改现有的类,然后知道您是在列表中的第一个项还是最后一个项。
foreach (Item item in this.Items
.Select((x, i) => {
x.ListIndex = i;
x.IsFirst = i == 0;
x.IsLast = i == this.Items.Count-1;
return x;
}))
你可以简单地扩展任何类,使用:
public abstract class IteratorExtender {
public int ListIndex { get; set; }
public bool IsFirst { get; set; }
public bool IsLast { get; set; }
}
public class Item : IteratorExtender {}
如果你想用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();
总是返回项目,即使你不做任何改变。这样它将被保存在列表中。