合并两个列表

时间:2014-02-21 18:06:32

标签: 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 ;

我想合并具有相同密钥的AlbumList1和AlbumList2中的列表。

例如,如果List被称为“Genre1”而另一个被称为“Genre1”,我想合并这两个列表来创建一个唯一的列表。

我该怎么做?

2 个答案:

答案 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()));