2014-02-21 124 views
2

的兩份名單,我想合併某一類名單的兩個列表共享同一個密鑰合併清單

比方說,我有類:

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」,我想合併這兩個列表來創建一個唯一的列表。

我該如何執行此操作?

+1

http://stackoverflow.com/questions/13505672/simplest-way-to-form-a-union-of-two-lists將有助於 – Miller

+0

的關鍵是什麼? '名稱'或'流派'? – itsme86

+0

列表的索引不是鍵......你必須解釋你想如何匹配它們才能編寫有用的代碼。 – evanmcdonnal

回答

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>

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