我有一个IEnumerable<string>正在传递给我,它包含以下内容:
现在,我试图实现的是按字母顺序排列项目,但我希望other项目保持在最后。我已经使用了OrderBy(i => i)
其中列出的项目如下:
我想要的结果是
我尝试过使用.OrderBy(i => i != "Other").ThenBy(i => i),但这会将Other项目放在最前面。
有人能告诉我如何做到这一点吗?
发布于 2017-04-27 09:51:50
您必须使用OrderByDescending,因为true比false“高”
list.OrderByDescending(s => s != "Other")
    .ThenBy(s => s);你也可以用
list.OrderBy(s => s == "Other" ? 1 : 0)
    .ThenBy(s => s);既然您已经问过了,下面是简化以后使用的扩展方法:
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);
}示例用法:
var list = new List<string> { "HP", "Other", "Samsung" };
var otherLast = list.OrderLast(s => s == "Other").ToList();发布于 2017-04-27 09:51:57
我试过使用
.OrderBy(i => i != "Other").ThenBy(i => i),但这会将其他项目放在最前面。
因此,您就快到了,您只需要颠倒第一个条件的排序顺序:将OrderBy替换为OrderByDesc ,或将替换为i == "Other。
当然,明确一点也没有坏处:布尔人的排序方式并不明显,所以我更喜欢这样做:
.OrderBy(i != "Other" ? 1 : 2).ThenBy(i => i);发布于 2017-04-27 09:54:51
另一个使用元组的选项:
list.OrderBy(s => Tuple.Create(s=="Other",s));或者,在C# 7中:
list.OrderBy(s => (s=="Other",s));OrderBy需要一个返回排序键的表达式。如果要按多个字段进行排序,则需要返回包含字段值的对象或元组。这和Select()没什么不同。
元组之所以需要,是因为它们已经实现了IComparable。返回匿名对象将失败,因为它没有实现此接口
https://stackoverflow.com/questions/43654322
复制相似问题