代码之家  ›  专栏  ›  技术社区  ›  Sisiutl

已加入集合的LINQ更新

  •  1
  • Sisiutl  · 技术社区  · 16 年前

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

    1 回复  |  直到 9 年前
        1
  •  2
  •   Timothy Walters    16 年前

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

    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