Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并两个列表_C#_.net_Linq_List - Fatal编程技术网

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列表?键不是这两个,它是列表的名称,例如,如果我将列表称为“示例”,则键将是示例列表示例;