如何使用LINQ按Publication对象的Authors列表字段分组?
用LINQ实现按作者分组出版物
没问题!你原来用字典循环的逻辑完全可以用LINQ更简洁地实现,核心思路是先把每个作者和对应的出版物“展开”成一对一的条目,再分组转字典。
直接上代码:
var dict = list // 先把每个出版物的所有作者拆成独立的(作者, 出版物)条目 .SelectMany(publication => publication.Authors.Select(author => new { Author = author, Publication = publication })) // 按作者分组 .GroupBy(item => item.Author) // 转成目标字典格式:键是作者名,值是该作者的出版物列表 .ToDictionary(group => group.Key, group => group.Select(item => item.Publication).ToList());
分步解释下每一步的作用:
SelectMany:替代了你原来的双层foreach循环——它会遍历每一个Publication,再遍历该出版物的每一个Author,把它们组合成一个包含作者和对应出版物的匿名对象,这样就把一对多的关系拆成了多个一对一的临时条目。GroupBy:按照作者名对这些临时条目进行分组,把同一个作者的所有出版物条目聚合到一起。ToDictionary:把分组后的结果转换成你需要的Dictionary<string, List<Publication>>类型,键是分组的作者名,值是从分组里提取出的所有出版物列表。
这个实现和你原来的字典逻辑完全一致:同一个作者的出版物会被收集到同一个列表里,不会遗漏任何作者-出版物的关联。
内容的提问来源于stack exchange,提问作者feigentoni
相关产品推荐
相关产品推荐

