从另一个列表中的对象更新列表中的所有对象

本文关键字:对象 列表 另一个 更新 | 更新日期: 2023-09-27 18:01:41

我有以下两个对象:

public class BlogPost
    {
        public int BlogPostId { get; set; }
        public Author Author { get; set; }
    }
public class Author
    {
        public int AuthorId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

我有两个独立的列表,其中包含50个Blog Post对象和50个Author对象。如何将两者结合起来,使Author对象分配给Blog Post的Author属性?

我试过使用Zip方法,但我不认为这是我想要的。这个问题是类似的,但我希望value是来自另一个列表的对象。

上下文:在EntityFramework中使用Seed方法填充我的数据库。

编辑:我应该提到这一点,因为它是种子数据,我并不关心哪个作者与哪个BlogPost匹配。这就是为什么我试图使用Zip方法。

从另一个列表中的对象更新列表中的所有对象

如果BlogPostAuthor对象通过索引链接,您可以使用for循环:

for(int i = 0; i < blogPosts.Count; i++)
    blogPosts[i].Author = authors[i];

你可以使用像Zip这样的LINQ方法,但是你必须从旧的对象中创建新的对象并填充一个新的列表。如果要修改原始集合,则for循环更为合适(也更有效)。你也可以只修改一个属性,而不需要复制所有的属性。

所以这也可以工作,但不是最好的方法(考虑到BlogPost有100个属性):

blogPosts = blogPosts.Zip(authors, (bp, a) => new BlogPost
{
    BlogPostId = bp.BlogPostId,
    Author = a
}).ToList();

但是这个要求带来了一个问题,为什么你一开始没有正确初始化BlogPost-list。为什么需要两个单独的集合呢?

您的blogpost实体需要维护一个FK AuthorId。当你这样做时,你可以:

public List<BlogPost> Compose(List<BlogPost> blogPosts, List<Author> authors) {
    var composedBlogPosts = new List<BlogPost> (blogPosts);
    foreach(var blogPost in blogPosts) {
        composedBlogPost.Author = authors.Single(a=>a.AuthorId == blogPost.AuthorId);
    }
    return composedBlogPost;
}