#c_sharp #list
Имеется такой класс: public class Song { public string Title {get; set;} public ListArtists {get; set;} } Ещё один класс для группы: public class GroupedSongs { public string GroupName {get; set;} public List Songs {get; set;} } И данные: List songs = new List () { new Song() { Title = "First song", Artists = new List {"Artist1", "Artist2"} }, new Song() { Title = "Second song", Artists = new List {"Artist2", "Artist3"} }, new Song() { Title = "Third song", Artists = new List {"Artist1", "Artist3"} } }; Каким образом можно сгруппировать список так, чтобы для каждого исполнителя была группа со списками его песен? Т. е, чтобы получилось следующее: // Переменная groups должна содержать список, полученное после группировки. List groups = new List () { new GroupedSongs() { GroupName = "Artist1", Songs = new List () { new Song() {Title = "First song"}, new Song() {Title = "Third song"} } }, new GroupedSongs() { GroupName = "Artist2", Songs = new List () { new Song() {Title = "First song"} new Song() {Title = "Second song"} }, }, new GroupedSongs() { GroupName = "Artist3", Songs = new List () { new Song() {Title = "Second song"} new Song() {Title = "Third song"} }, }, }
Ответы
Ответ 1
Например, так: var allArtists = songs.SelectMany(s => s.Artists).Distinct(); var groups = allArtists.Select(artist => new GroupedSongs() { GroupName = artist, Songs = songs.Where(s => s.Artists.Contains(artist)).ToList() }).ToList(); (Можно записать в одну строку, если хотите.)Ответ 2
Еще вариант в query-синтаксисе, с использованием GroupBy. Мне кажется выглядит более понятно. Listgroups = (from song in songs from artist in song.Artists group song by artist into grouppedSongs select new GroupedSongs() { GroupName = grouppedSongs.Key, Songs = grouppedSongs.ToList() }).ToList();
Комментариев нет:
Отправить комментарий