2015-12-25 4 views
0

Я получил этот код, который я кусочки, где я пытаюсь отсортировать список, по крайней мере, это то, что я пытаюсь сделать:пытается упорядочить список с Linq

List<TagLib.File> listOfFiles = new List<TagLib.File>(); 
foreach (string file in files) 
{ 
    TagLib.File fi = TagLib.File.Create(file); 
    listOfFiles.Add(fi); 
} 

System.Linq.IOrderedEnumerable<TagLib.File> pleaseSort 
    = listOfFiles.OrderBy(x => x.Tag.AlbumArtists) 
       .ThenBy(x => x.Tag.Album); 

foreach (TagLib.File tl in pleaseSort) 
{ 
    ... 
} 

линия, которая начинается с

System.Linq.IOrderedEnumerable 

позволяет программе идти мимо него, но затем в каждой строке шагового через код он восходит к IOrderedEnumerable, и именно там я получаю следующее сообщение об ошибке:

-2147024809 at least one object must implement IComparable

Я буду первым, кто признает, что я не эксперт, это проект для домашних животных, над которым я работаю, но я не могу найти документацию, в которой четко объясняется, что я должен делать в этом пример. Любая помощь будет высоко ценится.

+0

Что такое 'x.Tag.AlbumArtists'? –

+1

Либо 'x.Tag.AlbumArtists', либо' x.Tag.Album' (или оба) не реализуют 'IComparable'. Очевидно, что «AlbumArtists» - это своего рода список. Итак, когда вы говорите, что хотите заказать файлы «AlbumArtists», можете ли вы логически объяснить, как вы ожидаете, что сортировка будет работать? Что бы он сортировал точно? – sstan

+2

FWIW, вы проходите строку 'IOrderedEnumerable', потому что она не оценивает ваш оператор LINQ до цикла foreach. В этот момент он пытается оценить и выдает исключение. –

ответ

3

Проделав небольшое копирование в источнике для Tag.cs, который, по-видимому, является тем, что вы используете (было бы неплохо предоставить эту информацию, это трудно догадаться), я вижу, что AlbumArtists определяется как массив (string[]). Вот отсюда и проблема.

Массивы не реализуются IComparable. И, если вы думаете об этом, это имеет смысл. Если у вас есть 2 массива, которые нужно сортировать впереди другого? Каковы правила сортировки? Вы сортируете первый элемент каждого массива, последний, или применяете какую-то другую логику сортировки? Нет четких правил сортировки массивов и поэтому не может автоматически определяться .NET Framework, что приводит к ошибке, которую вы получили.

В основном, чтобы сделать эту работу, вам нужно определить, как сортировать AlbumArtists массивы из разных тегов. Вы можете сделать это, вызвав перегруженный метод OrderBy, где вы можете указать свою собственную реализацию IComparer.

Или, скажем, вы хотите, своего рода должна основываться на первого элемента AlbumArtists массива, то вы можете изменить код доступа только, что первый элемент (который является сопоставимыми), и он должен работать нормально (если в каждом теге есть, по крайней мере, один художник из альбома):

listOfFiles.OrderBy(x => x.Tag.AlbumArtists[0]) // access the first item only. 
      .ThenBy(x => x.Tag.Album); 
Смежные вопросы