所以我有这个列表,它返回一个ID和一个缩略图。恩。 List<PersonPicture>
我有这个列表List<Person>
,其中有一个名为“picture”的属性。
无论如何我可以合并这两个属性并将List<PersonPicture>
添加到名为“picture”的属性中,并通过ID将其作为基础,因为它们具有相同的属性吗?
任何帮助都将不胜感激。
答案 0 :(得分:2)
您可以在此示例下使用匿名对象:
List<PersonPicture> pictures = LoadPictures();
List<Person> persons = LoadPersons();
var result = persons.Select(pers => new
{
Id = pers.Id,
Name = pers.Name,
Picture = pictures.Where(pic => pic.PersId == pers.Id)
.FirstOrDefault()
.Thumbnail
};
另一种解决方案是使用Join:
var result = persons.Join(pictures,
pers => pers.Id,
pic => pic.PersId,
(pers, pic) => {
return new
{
Id = pers.Id,
Name = pers.Name,
Picture = pic.Thumbnail
};
});
答案 1 :(得分:2)
LINQ并不是设计用于修改像这样的现有集合,但你可以这样做:
foreach (tup in people
.Join(
picture,
person => person.ID,
picture => picture.ID,
Tuple.Create
))
{
tup.Item1.Picture = tup.Item2;
}
编辑:请注意,如果一个人有多张图片,这将产生不可预测的结果。这是一种可能性,应该如何处理?
答案 2 :(得分:0)
您可以在linq中使用Join或Zip运算符。这些链接将引导您询问有关使用它们的语法。基本上,Join只是像SQL一样基于一个键将两个列表一起添加,Zip通过匹配每个列表中每个元素的位置来合并两个列表。
答案 3 :(得分:0)
您希望加入基于共享密钥的两个列表 - ID。
基本上,您希望使用LINQ中的Join
运算符来查找匹配相同ID的Person
和PersonPicture
对:
persons.Join(pictures, // join these two lists
person => person.Id, // extract key from person
personPicture => personPicture.PersonId, // extract key from picture
(person, personPicture) => ??? // do something with each matching pair
您现在面临的问题是如何处理每个匹配对; Join
允许您提供一个带有匹配对的委托并返回其他内容,而Join操作的结果将是从每个匹配对产生的其他内容的列表。
您的问题是您希望拍摄每一对并对其执行某些操作 - 具体而言,您希望将图片从PersonPicture
对象复制到Person
对象。由于LINQ完全是为了查找数据而不是修改数据,因此这并非易事。
您可以通过两种方式完成此操作。一种是从每对创建一个临时对象,然后迭代它并做你的事情:
var pairs = persons.Join(pictures,
person => person.Id,
personPicture => personPicture.PersonId,
(person, personPicture) => new { person, personPicture };
foreach (var pair in pairs)
pair.person.Picture = pair.personPicture.Thumbnail;
(您可以使用Tuple而不是临时对象,如另一个答案所示)。
这很有效,但由于临时对象(无论是匿名对象还是元组),它看起来很笨拙。
或者,您可以在委托内部进行赋值,并返回Person对象本身,因为您已经完成了PersonPicture对象:
var personsWithPicturesPopulated = persons.Join(pictures,
person => person.Id,
personPicture => personPicture.PersonId,
(person, personPicture) => {
person.Picture = personPicture.Thumbnail;
return person;
});
这有一个额外的好处,就是在personPictures
列表中找到您找到匹配的人员列表,省略没有匹配的人;这有时正是你所需要的(有时它不是,在这种情况下你可以放弃连接的结果)。