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

Met*_*uru 30 c# sorting list

假设我有一首歌曲列表.

Song {
    public string Name = "";
    public int PlayOrder = 0;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

/*
    Pachelbel's Canon, 0
    A Happy Song, 4
    Beethoven's 5th, 4
    Some Other Song, 7
*/
Run Code Online (Sandbox Code Playgroud)

请参阅按字母顺序查看PlayOrder = 4的顺序?这就是我想要的.

现在我只有一个字段排序:

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

...

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

return final;
Run Code Online (Sandbox Code Playgroud)

我如何按名称排序,如上所示?

Kri*_*nov 54

return final.OrderBy(s => s.PlayOrder).ThenBy(s => s.Name);
Run Code Online (Sandbox Code Playgroud)

  • 注意,这将返回一个新的`IEnumerable &lt;Song&gt;`序列,而不是就地对原始列表进行排序。 (2认同)

tst*_*ter 30

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

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

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

  • 注意:Sort()"执行不稳定排序",而OrderBy"执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序" (3认同)