如何通过多个T.attributes对List <t>进行排序?</t>

时间:2011-02-02 14:41:15

标签: c# list sorting

假设我有一首歌曲列表。

Song {
    public string Name = "";
    public int PlayOrder = 0;
    }

现在我想首先按PlayOrder对它们进行排序,从零开始按名称按字母顺序排序。

因此,一组示例排序结果将是(Name,PlayOrder):

/*
    Pachelbel's Canon, 0
    A Happy Song, 4
    Beethoven's 5th, 4
    Some Other Song, 7
*/

按字母顺序查看PlayOrder = 4的顺序?这就是我想要的。

现在我只能按一个字段排序:

List<Song> final = new List<Song>();

...

final.Sort((x, y) => x.PlayOrder.CompareTo(y.PlayOrder));

return final;

如何按照上面所示的名称进行排序?

3 个答案:

答案 0 :(得分:49)

return final.OrderBy(s => s.PlayOrder).ThenBy(s => s.Name);

答案 1 :(得分:25)

如果您想继续使用sort方法,则需要使比较功能更加智能化:

final.Sort((x, y) => {
    var ret = x.PlayOrder.CompareTo(y.PlayOrder);
    if (ret == 0) ret = x.Name.CompareTo(y.Name);
    return ret;
});

如果您想使用LINQ,那么您可以使用K Ivanov发布的内容。

答案 2 :(得分:0)

如果只有一种首选的方式对歌曲class进行排序,则应实现IComparable和/或IComparable<Song>

List<Song> songs = GetSongs();
songs.Sort(); // Sorts the current list with the Comparable logic

如果您有多种方式来存储列表,IEqualityComparer<T>是您要实现的接口。然后,您可以在List<T>Sort()中提供该比较器作为参数。