使用linq的OrderBy方法按ID对列表进行排序

3

我有一个用户列表,我想按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

这是否可能?

谢谢。


3
你能展示一些样本输入/输出吗?很难理解你在询问什么。 - Rahul Singh
我不明白你需要看什么。list<user> 包含用户属性。其中一个属性是 ID。我想将 ID 传递给控制器,然后使用此 ID 作为起始索引对列表进行排序。 - Lahib
不清楚你想要什么,但是最好的猜测是 - .Where(m => m.ID >= thisID).OrderBy(m => m.ID) - user3559349
3个回答

2
你可以做到这一点。
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.
}

由于某些原因,我无法使用您建议的第一个示例。它仍然按全名对用户进行排序。我无法使用第二个示例,因为我无法在indexOf中使用lambda表达式,因为它需要一个User作为参数。 - Lahib
@Lahib,我已经编辑了第二段代码。现在应该可以工作了。另外,对于第一段代码,请尝试将其更改为list.OrderBy(m => m.FullName).ThenByDescending(m => m.Id == passedId) - M.kazem Akhgary
我感谢你的帮助,我很感激。 - Lahib

2
你可以利用LINQ提供的OrderBy和ThenBy表达式进行排序。
在排序时,第一条也是最重要的规则是对象匹配指定的ID,因此OrderBy应该使用它作为条件。第二条规则是按名称排序,因此应该使用ThenBy和m.FullName条件。
var orderedList = list.OrderBy(m => m.ID == specifiedId).ThenBy(m => m.FullName).ToList();

这里有一个关于OrderBy和ThenBy的问题在stackoverflow上有一个很好而且清晰的答案:

https://dev59.com/8W865IYBdhLWcg3wi_M2#3760014


在这里,OrderBy将真实项目移动到末尾。因为升序是false -> true,所以你应该使用降序,即true -> false - M.kazem Akhgary
我尝试了这个。但是出于某种原因,它仍然采用全名排序。也许这与列表在其他地方也有序有关,或者这并不重要? - Lahib

2

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

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

即使列表已经按照某些未知标准排序,你仍然可以像上面那样应用OrderBy(不使用ThenBy),因为根据Enumerable.OrderBy文档,该方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。请注意保留HTML标签。

1
谢谢你分享的示例,这个完美地运行了。 - Lahib
我想知道为什么bool版本对OP无效。 - M.kazem Akhgary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接