我有以下类结构:
List<Parent> ParentList = new List<Parent>();
class Parent
{
string ParentName { get; set; }
List<Child> ChildList = new List<Child>();
}
class Child
{
string ParentName { get; set; }
string ChildName { get; set; }
string someValue { get; set; }
}
在上面的场景中,我有一个Child
类型的对象,让我们保留ChildObject,以及一个填充了数据的ParentList
。我想将someValue
中存在的ParentList
属性修改为我在子对象中的值。
我试过了:
ParentList.Where(p => p.ParentName == ChildObject.ParentName)
.Select(c => c.ChildList
.Where(ch => ch.ChildName == ChildObject.ChildName)
.Select(s => s.someValue = ChildObject.someValue));
但我的属性值未设置。怎么写这个?
答案 0 :(得分:2)
如果您想更新父母的所有孩子,可以使用List.ForEach()
方法。
// assumes childObject is your instance of a child you have from elsewhere
parentList
// assuming parent name is unique
.First(p => p.ParentName == childObject.ParentName)
// not sure if child name is unique, allowing multiple
.ChildList.Where(c => c.ChildName == childObject.ChildName)
// convert to List<Child> so we can use ForEach()
.ToList()
.ForEach(c => c.someValue = childObject.someValue);
如果可能有多个家长,那么您需要更改为SelectMany
,根据需要更新您的问题。
如果您只想要单亲的单个孩子,那么您不需要使用Where
和Select
,只需在两者上使用First
,或{{1}如果您不确定是否可以找到它,请使用null检查。
注意:FirstOrDefault
是仅在List<T>.ForEach()
上找到的扩展函数,虽然它看起来很适合流畅的LINQ语法,但它是一个非常不同的野兽。我强烈建议使用List
循环进行修改以避免混淆。有关更多详细信息,请参阅"foreach" vs "ForEach"上的此链接(请转至@ScottChamberlain获取该链接)。
答案 1 :(得分:0)
var filteredParents = ParentList.Where(p => p.ParentName == ChildObject.ParentName);
var childItems = filteredParents.ChildList.Where(c=>c.ChildName == ChildObject.ChildName);
childItems.foreach((child)=>{
child.someValue = ChildObject.someValue;
})
这对你有用吗?或者你想要实现这一个声明吗?