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

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

谢谢

【问题讨论】:

    标签: linq outer-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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多