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