我想合并两个共享同一个键的类列表
假设我有班级:
public class Album {
public string Name { get ; set; }
public string Genre{ get ; set; }
}
和两份清单:
public List<List<Album>> AlbumList1 ;
public List<List<Album>> AlbumList1 ;
我想合并具有相同密钥的AlbumList1和AlbumList2中的列表。
例如,如果List被称为“Genre1”而另一个被称为“Genre1”,我想合并这两个列表来创建一个唯一的列表。
我该怎么做?
答案 0 :(得分:3)
看起来可能有点像这样:
var results = albumList1
.SelectMany(l => l)
.Concat(albumList2.SelectMany(l => l)
.GroupBy(l => l.Name, g => g.ToList())
.ToList();
或者也许是这样:
var results = albumList1
.Join(albumList2,
l => l[0].Name,
l => l[0].Name,
(l1, l2) => l1.Concat(l2).ToList())
.ToList();
但是,我还建议您考虑重构代码以使用IDictionary<string, IEnumerable<Album>>
或ILookup<string, Album>
代替。
答案 1 :(得分:0)
好像你可能想要将一个外部列表重构一个类。像这样:
public class Genre
{
public string Name { get; set; }
public List<Album> Albums { get; set; }
}
public class Album
{
public string Genre { get; set; }
public string Name { get; set; }
}
之后,您可以创建比较器(简化)
public class GenreComarer : IEqualityComparer<Genre>
{
public bool Equals(Genre x, Genre y)
{
return x.Name.Equals(y.Name);
}
public int GetHashCode(Genre obj)
{
return obj.Name.GetHashCode();
}
}
public class AlbumComarer : IEqualityComparer<Album>
{
public bool Equals(Album x, Album y)
{
return x.Name.Equals(y.Name);
}
public int GetHashCode(Album obj)
{
return obj.Name.GetHashCode();
}
}
然后,这是一个简单的连接 - 在缺少的流派中添加回来。
List<Genre> unified = list1.Join(list2,
e => e.Name,
e => e.Name,
(genre1, genre2) => new Genre
{
Name = genre1.Name,
Albums = genre1.Albums.Union(genre2.Albums, new AlbumComarer()).ToList()
}
).ToList();
unified.AddRange(list2.Except(list1, new GenreComarer()));
unified.AddRange(list1.Except(list2, new GenreComarer()));