C# 合并两个列表
我想合并共享同一密钥的某个类的两个列表 假设我有一门课:C# 合并两个列表,c#,.net,linq,list,C#,.net,Linq,List,我想合并共享同一密钥的某个类的两个列表 假设我有一门课: public class Album { public string Name { get ; set; } public string Genre{ get ; set; } } 以及两份名单: public List<List<Album>> AlbumList1 ; public List<List<Album>> AlbumList1 ; 公共列表相册列表1; 公
public class Album {
public string Name { get ; set; }
public string Genre{ get ; set; }
}
以及两份名单:
public List<List<Album>> AlbumList1 ;
public List<List<Album>> AlbumList1 ;
公共列表相册列表1;
公开名单1;
我想合并AlbumList1和AlbumList2中具有相同键的列表
例如,如果一个列表名为“Genre1”,另一个列表名为“Genre1”,我希望合并这两个列表以创建一个唯一的列表
如何执行此操作?它可能看起来有点像这样:
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();
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; }
}
或者像这样:
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();
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; }
}
<>但是,我也建议你考虑重构代码,使用一个<代码> IDICORION<代码>或一个<代码> ILookup <代码>。
看起来你可能想把一个外部列表重构成一个类。大概是这样的:
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();
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; }
}
公共类体裁
{
公共字符串名称{get;set;}
公共列表相册{get;set;}
}
公开课相册
{
公共字符串类型{get;set;}
公共字符串名称{get;set;}
}
然后,您可以创建一个比较器(简化)
public类GenreComarer:IEqualityComparer
{
公共布尔等于(类型x、类型y)
{
返回x.Name.Equals(y.Name);
}
公共int GetHashCode(类型obj)
{
返回obj.Name.GetHashCode();
}
}
公共类相册管理员:IEqualityComparer
{
公共布尔等于(唱片集x、唱片集y)
{
返回x.Name.Equals(y.Name);
}
public int GetHashCode(相册对象)
{
返回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()));
List unified=list1.Join(list2,
e=>e.Name,
e=>e.Name,
(genre1,genre2)=>新体裁
{
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());
会有帮助吗钥匙是什么<代码>名称或类型
?列表具有索引而不是键。。。你必须解释你想如何匹配它们,以便我编写有用的代码。我很困惑-你想要一个单一的专辑列表
还是一个单一的列表
s列表?键不是这两个,它是列表的名称,例如,如果我将列表称为“示例”,则键将是示例列表示例;