我有一个用户列表,我想按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
这是否可能?
谢谢。
var passedId = 2123;
list = list.OrderByDescending(m => m.Id == passedId).ThenBy(m => m.FullName).ToList();
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.
}
list.OrderBy(m => m.FullName).ThenByDescending(m => m.Id == passedId)
。 - M.kazem Akhgaryvar orderedList = list.OrderBy(m => m.ID == specifiedId).ThenBy(m => m.FullName).ToList();
这里有一个关于OrderBy和ThenBy的问题在stackoverflow上有一个很好而且清晰的答案:
OrderBy
将真实项目移动到末尾。因为升序是false -> true
,所以你应该使用降序,即true -> false
。 - M.kazem Akhgary我个人不喜欢依赖于bool
排序(看起来奇怪且不自然),而更喜欢使用显式表达式。在您的情况下,可以这样:
// ...
.OrderBy(m => m.ID == passedId ? 0 : 1)
.ThenBy(m => m.FullName) // or whatever is needed
OrderBy
(不使用ThenBy
),因为根据Enumerable.OrderBy
的文档,该方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。请注意保留HTML标签。
.Where(m => m.ID >= thisID).OrderBy(m => m.ID)
。 - user3559349