-1

所以我有这个列表,它返回一个 ID 和一个缩略图。前任。List<PersonPicture> 我有这个列表,List<Person>其中有一个名为“图片”的属性。无论如何我可以合并这两个属性并将其添加List<PersonPicture>到其中名为“图片”的属性中,并通过 ID 将其作为基础,因为它们具有相同的属性?

任何帮助,将不胜感激。

4

4 回答 4

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
    };
  });
于 2012-10-01T18:24:54.983 回答
2

LINQ 并不是为像这样修改现有集合而设计的,但您可以这样做:

foreach (tup in people
    .Join(
        picture,
        person => person.ID,
        picture => picture.ID,
        Tuple.Create
    ))
{
    tup.Item1.Picture = tup.Item2;
}

编辑:请注意,如果一个人有不止一张照片,这将产生不可预测的结果。有这种可能吗,应该如何处理?

于 2012-10-01T18:29:29.283 回答
0

您可以在 linq中使用JoinZip运算符。这些链接将带您了解有关使用它们的语法的问题。基本上,Join 只是根据 SQL 中的键将两个列表添加在一起,Zip 通过匹配每个列表中每个元素的位置来合并两个列表。

于 2012-10-01T18:24:56.733 回答
0

您希望基于共享密钥(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列表,省略那些没有匹配的人;这有时正是您需要的(有时不是,在这种情况下您可以丢弃连接的结果)。

于 2012-10-01T18:29:57.993 回答