加入集合的 LINQ 更新

Posted

技术标签:

【中文标题】加入集合的 LINQ 更新【英文标题】:LINQ update on joined collections 【发布时间】:2010-12-04 19:46:15 【问题描述】:

如何使用 LINQ 从第二个列表中的对象更新第一个列表中的对象?我的问题与LINQ In Line Property Update During Join 非常相似,只是在我的情况下,第二个列表小于父列表。 换句话说,我想更新那些在第二个集合中具有相应更新的主集合成员。否则我希望主对象保持不变。上面引用的文章中的技术似乎导致了两个集合的内部连接。

谢谢

【问题讨论】:

【参考方案1】:

另一篇文章中的答案也适合您的问题,因为您真正想要的是内部连接。需要注意的是,内连接仅用于执行功能,而不是修改列表(即不满足内连接的项目在列表中保持不变)。

为了完整起见,这是我将使用的解决方案:

List<Person> people = new List<Person>();
people.Add( new Person Name = "Timothy", Rating = 2  );
people.Add( new Person Name = "Joe", Rating = 3  );
people.Add( new Person Name = "Dave", Rating = 4  );

List<Person> updatedPeople = new List<Person>();
updatedPeople.Add( new Person  Name = "Timothy", Rating = 1  );
updatedPeople.Add( new Person  Name = "Dave", Rating = 2  );

ShowPeople( "Full list (before changes)", people );

Func<Person, Person, Person> updateRating =
    ( personToUpdate, personWithChanges ) =>
    
        personToUpdate.Rating = personWithChanges.Rating;
        return personToUpdate;
    ;
var updates = from p in people
              join up in updatedPeople
                  on p.Name equals up.Name
              select updateRating( p, up );

var appliedChanges = updates.ToList();

ShowPeople( "Full list (after changes)", people );
ShowPeople( "People that were edited", updatedPeople );
ShowPeople( "Changes applied", appliedChanges );

这是我得到的输出:

Full list (before changes)
-----
Name: Timothy, Rating: 2
Name: Joe, Rating: 3
Name: Dave, Rating: 4

Full list (after changes)
-----
Name: Timothy, Rating: 1
Name: Joe, Rating: 3
Name: Dave, Rating: 2

People that were edited
-----
Name: Timothy, Rating: 1
Name: Dave, Rating: 2

Changes applied
-----
Name: Timothy, Rating: 1
Name: Dave, Rating: 2

【讨论】:

以上是关于加入集合的 LINQ 更新的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq 一次更新可观察集合项的两个字段

使用 linq 按 id 加入集合 [重复]

使用LINQ vs CollectionView过滤集合

是否可以使用 LINQ 执行基于集合的属性分配?

刷新 WPF Datagrid 未绑定到可观察集合?

LinQ开篇介绍