首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我如何订购一个IEnumerable<T>,使一个特殊的项目总是在底部?

我如何订购一个IEnumerable<T>,使一个特殊的项目总是在底部?
EN

Stack Overflow用户
提问于 2017-04-27 09:49:50
回答 5查看 185关注 0票数 4

我有一个IEnumerable<string>正在传递给我,它包含以下内容:

  • 惠普
  • 佳能
  • 词法标
  • 三星
  • 其他

现在,我试图实现的是按字母顺序排列项目,但我希望other项目保持在最后。我已经使用了OrderBy(i => i)

其中列出的项目如下:

  • 佳能
  • 惠普
  • 词法标
  • 其他
  • 三星

我想要的结果是

  • 佳能
  • 惠普
  • 词法标
  • 三星
  • 其他

我尝试过使用.OrderBy(i => i != "Other").ThenBy(i => i),但这会将Other项目放在最前面。

有人能告诉我如何做到这一点吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-04-27 09:51:50

您必须使用OrderByDescending,因为truefalse“高”

代码语言:javascript
运行
复制
list.OrderByDescending(s => s != "Other")
    .ThenBy(s => s);

你也可以用

代码语言:javascript
运行
复制
list.OrderBy(s => s == "Other" ? 1 : 0)
    .ThenBy(s => s);

既然您已经问过了,下面是简化以后使用的扩展方法:

代码语言:javascript
运行
复制
public static IEnumerable<T> OrderFirst<T>(this IEnumerable<T> sequence, Func<T, bool> predicate)
{
    return sequence.OrderByDescending(predicate);
}

public static IEnumerable<T> OrderLast<T>(this IEnumerable<T> sequence, Func<T, bool> predicate)
{
    return sequence.OrderBy(predicate);
}

示例用法:

代码语言:javascript
运行
复制
var list = new List<string> { "HP", "Other", "Samsung" };
var otherLast = list.OrderLast(s => s == "Other").ToList();
票数 5
EN

Stack Overflow用户

发布于 2017-04-27 09:51:57

我试过使用.OrderBy(i => i != "Other").ThenBy(i => i),但这会将其他项目放在最前面。

因此,您就快到了,您只需要颠倒第一个条件的排序顺序:将OrderBy替换为OrderByDesc ,或将替换为i == "Other

当然,明确一点也没有坏处:布尔人的排序方式并不明显,所以我更喜欢这样做:

代码语言:javascript
运行
复制
.OrderBy(i != "Other" ? 1 : 2).ThenBy(i => i);
票数 4
EN

Stack Overflow用户

发布于 2017-04-27 09:54:51

另一个使用元组的选项:

代码语言:javascript
运行
复制
list.OrderBy(s => Tuple.Create(s=="Other",s));

或者,在C# 7中:

代码语言:javascript
运行
复制
list.OrderBy(s => (s=="Other",s));

OrderBy需要一个返回排序键的表达式。如果要按多个字段进行排序,则需要返回包含字段值的对象或元组。这和Select()没什么不同。

元组之所以需要,是因为它们已经实现了IComparable。返回匿名对象将失败,因为它没有实现此接口

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43654322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档