【问题标题】:Use linq OrderBy to order a list by an ID [closed]使用 linq OrderBy 按 ID 对列表进行排序 [关闭]
【发布时间】:2015-12-20 20:23:26
【问题描述】:

我有一个想要按 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

这可能吗?

谢谢。

【问题讨论】:

  • 你能展示一些示例输入\输出吗?很难理解你在问什么。
  • 我不明白你需要看什么。 list 包含用户属性。这些属性之一是 ID。我想将 ID 传递给控制器​​,然后用这个 ID 作为开始索引来排序我的列表。
  • 不清楚你想要什么,但最好的猜测 - .Where(m => m.ID >= thisID).OrderBy(m => m.ID)

标签: c# .net linq


【解决方案1】:

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

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

即使列表已经按某些未知标准排序,您仍然可以像上面一样应用OrderBy(不带ThenBy),因为根据Enumerable.OrderBy documentation

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

【讨论】:

  • 感谢您分享的示例,效果很好
  • 我想知道为什么 bool 版本不适用于 OP。
【解决方案2】:

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

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

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

这是关于 stackoverflow 的另一个问题,它对 OrderBy 和 ThenBy 有一个很好而清晰的答案:

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

【讨论】:

  • 这里OrderBy 将真正的项目移到最后。因为升序是false -> true。你应该使用降序,即true -> false
  • 我试过这样做。但由于某种原因,它仍然需要全名排序。也许它与列表有关,也被排序在其他地方或者没关系?
【解决方案3】:

你可以这样做。

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 表达式,因为它需要一个用户作为参数
  • @Lahib ive 编辑了第二个代码。它现在应该可以工作了。顺便说一句,第一个代码尝试将其更改为 list.OrderBy(m => m.FullName).ThenByDescending(m => m.Id == passedId)
  • 感谢您的帮助,我很感激,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多