修改列表中的项目

时间:2013-12-06 04:19:36

标签: c# linq list c#-4.0

我有以下类结构:

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));

但我的属性值未设置。怎么写这个?

2 个答案:

答案 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,根据需要更新您的问题。

如果您只想要单亲的单个孩子,那么您不需要使用WhereSelect,只需在两者上使用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;
})

这对你有用吗?或者你想要实现这一个声明吗?