使用linqOrderBy按ID对列表进行排序

本文关键字:排序 列表 linqOrderBy ID 使用 | 更新日期: 2023-09-27 18:27:24

我有一个用户列表,我想按ID排序。所以现在列表按用户全名排序,如下所示:

OrderBy(m => m.FullName).ToList();

我想做的是对这个列表进行排序,以便在开始索引处设置一个特定的id。

所以伪代码是:

var passedId = 2123
OrderBy(m=>m.ID); // And then set passedId to be in the start index of the list

这可能吗?

谢谢。

使用linqOrderBy按ID对列表进行排序

我个人不喜欢依赖bool排序(看起来奇怪而不自然),更喜欢使用显式表达式。在你的情况下,像这个

// ...
.OrderBy(m => m.ID == passedId ? 0 : 1)
.ThenBy(m => m.FullName) // or whatever is needed

即使列表已经按照一些未知的标准排序,您仍然可以像上面一样应用OrderBy(w/o ThenBy),因为根据Enumerable.OrderBy文档

此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。

您可以使用LINQ提供的OrderBy和ThenBy表达式。

排序时的第一条也是最重要的规则是,对象与指定的ID匹配,正如您所说,因此OrderBy应该将其用作条件。第二条规则是按名称排序,因此您应该将ThenBy与m.FullName条件一起使用。

var orderedList = list.OrderBy(m => m.ID == specifiedId).ThenBy(m => m.FullName).ToList();

这里有另一个关于stackoverflow的问题,它有一个很好的、清晰的答案来回答OrderBy和ThenBy:

https://stackoverflow.com/a/3760014/5698997

您可以这样做。

var passedId = 2123;
list = list.OrderByDescending(m => m.Id == passedId).ThenBy(m => m.FullName).ToList();

这使得具有特定id的用户排在第一位,其他用户将按名称排序。

或者,如果列表已按名称排序,则可以执行此操作。

var user = list.FirstOrDefault(m => m.Id == passedId); // find user with id
if(user != null)
{
    list.Remove(user); // remove user
    list.Insert(0, user); // add user to beginning.
}