#c_sharp #list
Имеется такой класс:
public class Song {
public string Title {get; set;}
public List Artists {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();
Комментариев нет:
Отправить комментарий