Как сделать многоуровневую сортировку в списке класса с несколькими переменными - PullRequest
0 голосов
/ 12 июля 2011

У меня есть класс Movies со следующими объявленными переменными:

string Title;
string Plot;
string MPAA;
string Certification;
string[] Genres;

Я создаю список фильмов со следующим кодом:

Movie m = new Movie(strTitle, strPlot, strMPAA, strCertification, strArrGenres);
MovieList.Add(m);

Я сейчас пытаюсьвыяснить лучший способ сортировки списка.Мне нужно сделать две сортировки, первая - простая сортировка по названию.Я попытался использовать LINQ, но не могу понять, как правильно получить доступ к переменной в фильме.

Второй вариант будет более сложным.Мне нужно отсортировать по жанру, затем название.Конечно, у каждого фильма может быть несколько жанров, и я знаю, что в итоге у меня будет несколько фильмов, поскольку фильм будет в каждом жанре.

Ответы [ 2 ]

8 голосов
/ 12 июля 2011
MovieList.OrderBy(m => m.Title)

и

MovieList.OrderBy(m => m.Genre).ThenBy(m => m.Title)

должны это сделать.

Используйте .OrderByDescending() и .ThenByDescending(), если хотите, чтобы сортировка по убыванию

2 голосов
/ 12 июля 2011

Я не понял, как вы хотите отсортировать по жанрам, если они содержатся в фильмах, может быть, вы хотите отфильтровать по жанру, а затем отсортировать по названию?

    class Movie
    {
        public string Title { get; set; }
        public string[] Genres { get; set; }
    }
    static void Main(string[] args)
    {
        var movies = new List<Movie>();
        movies.Add(new Movie { Title = "Pulp Fiction", Genres = new string[] { "Crime", "Thriller" } });
        movies.Add(new Movie { Title = "Back to the Future", Genres = new string[] { "Adventure", "Sci-Fi" } });
        movies.Add(new Movie { Title = "The Dark Knight", Genres = new string[] { "Action", "Crime" } });

        var byTitle = from m in movies orderby m.Title select m;

        var crimeMovies = from m in movies where m.Genres.Contains("Crime") orderby m.Title select m;
    }

РЕДАКТИРОВАТЬ: Выбор фильмов с жанром и упорядочение по жанру, а затем название (в соответствии с комментарием):

        var distinctGenres = from m in movies
                             from genre in m.Genres
                             group genre by genre into genres
                             select genres.First();                          

        var moviesWithGenre = from g in distinctGenres
                              from m in movies
                              where m.Genres.Contains(g)
                              orderby g, m.Title
                              select new { Genre = g, Movie = m };

        foreach (var m in moviesWithGenre)
        {
            Console.WriteLine("Genre: "+ m.Genre + " - " + m.Movie.Title);
        }

Выход:

Genre: Action - The Dark Knight
Genre: Adventure - Back to the Future
Genre: Crime - Pulp Fiction
Genre: Crime - The Dark Knight
Genre: Sci-Fi - Back to the Future
Genre: Thriller - Pulp Fiction
...