所以我有这个列表,它返回一个 ID 和一个缩略图。前任。List<PersonPicture>
我有这个列表,List<Person>
其中有一个名为“图片”的属性。无论如何我可以合并这两个属性并将其添加List<PersonPicture>
到其中名为“图片”的属性中,并通过 ID 将其作为基础,因为它们具有相同的属性?
任何帮助,将不胜感激。
所以我有这个列表,它返回一个 ID 和一个缩略图。前任。List<PersonPicture>
我有这个列表,List<Person>
其中有一个名为“图片”的属性。无论如何我可以合并这两个属性并将其添加List<PersonPicture>
到其中名为“图片”的属性中,并通过 ID 将其作为基础,因为它们具有相同的属性?
任何帮助,将不胜感激。
您可以为此使用匿名对象,下面是一个示例:
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
};
});
LINQ 并不是为像这样修改现有集合而设计的,但您可以这样做:
foreach (tup in people
.Join(
picture,
person => person.ID,
picture => picture.ID,
Tuple.Create
))
{
tup.Item1.Picture = tup.Item2;
}
编辑:请注意,如果一个人有不止一张照片,这将产生不可预测的结果。有这种可能吗,应该如何处理?
您希望基于共享密钥(ID)加入这两个列表。
基本上,您想Join
在 LINQ 中使用运算符来查找匹配相同 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;
(您可以使用元组而不是临时对象,正如另一个答案中所建议的那样)。
这可行,但由于临时对象(无论是匿名对象还是元组)而显得笨拙。
或者,您可以直接在委托内部进行分配,并返回 Person 对象本身,因为您已经完成了 PersonPicture 对象:
var personsWithPicturesPopulated = persons.Join(pictures,
person => person.Id,
personPicture => personPicture.PersonId,
(person, personPicture) => {
person.Picture = personPicture.Thumbnail;
return person;
});
这有一个额外的好处是给你一个你在列表中找到匹配的人的personPictures
列表,省略那些没有匹配的人;这有时正是您需要的(有时不是,在这种情况下您可以丢弃连接的结果)。