Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Группировка объектов по массиву/списку данного объекта

#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. Мне кажется выглядит более понятно. List groups = (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();

Комментариев нет:

Отправить комментарий