试图用Linq对列表进行排序

时间:2015-12-25 03:21:07

标签: c# 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至少有一个对象必须实现IComparable

我是第一个承认我不是专家的人,这只是我正在做的一个宠物项目,但我找不到任何明确解释什么的文档我应该在这个例子中做。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

通过对Tag.cs的源代码进行一些挖掘,这似乎是你正在使用的东西(提供这些信息会很好,很难猜测),我可以看到{{1定义为字符串数组(AlbumArtists)。这就是问题的来源。

数组不实现string[]。并且,如果你考虑它,它是有道理的。如果你有2个阵列,哪一个应该排在另一个阵列之前?什么是排序规则?您是对每个数组的第一项进行排序,还是应用其他排序逻辑?对于如何对数组进行排序没有明确的规则,因此无法由.NET Framework自动确定,从而导致出现错误。

基本上,为了使这项工作,你需要负担定义如何从不同的标签中排序IComparable数组的负担。您可以通过调用重载的OrderBy方法来指定自己的IComparer实现。

或者,假设您希望排序基于AlbumArtists数组的 first 元素,那么您可以将代码更改为仅访问第一个元素(可比的),它应该工作正常(只要每个标签在阵列中至少有一个专辑艺术家):

AlbumArtists