从另一个列表中的对象更新列表中的所有对象
本文关键字:对象 列表 另一个 更新 | 更新日期: 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方法。
如果BlogPost
和Author
对象通过索引链接,您可以使用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;
}