LINQ顺序由布尔


111

我有一个linq查询,我想按f.bar(它是一个字符串)进行排序,但我也想首先按f.foo(它是一个布尔字段)对其进行排序。像下面的查询。

(from f in foo
orderby f.foo, f.bar
select f)

尽管可以编译,但无法正常工作。它只是通过f.bar来排序,而忽略布尔字段。

我知道自己很傻,但是我需要怎么做才能获得这种行为?

谢谢

Answers:


175

那应该工作得很好-它应该先对具有falsefoo值的实体进行排序,然后再对具有truefoo值的实体进行排序。

这肯定在LINQ to Objects中有效-您实际上在使用哪个LINQ提供程序?

这里有一个LINQ到对象例子的工作:

using System;
using System.Linq;

public static class Test
{
    public static void Main()
    {
        var data = new[]
        {
            new { x = false, y = "hello" },
            new { x = true, y = "abc" },
            new { x = false, y = "def" },
            new { x = true, y = "world" }
        };

        var query = from d in data
                    orderby d.x, d.y
                    select d;

        foreach (var result in query)
        {
            Console.WriteLine(result);
        }
    }

}

51
史诗般的失败...只是意识到这是由于错误导致f.foo始终是错误的....所以感到尴尬
mat-mcloughlin

5
正确,按升序(默认)排序,false(0)在true(1)之前。
Silkfire'Apr

如何按第2列中的true数对Column1进行分组?
Oracular Man '18

2
@OracularMan:我建议您提出一个带有详细示例的新问题。
乔恩·斯基特

1
@Sipo:像data.OrderBy(d => d.x).ThenBy(d => d.y)
乔恩·斯基特

119

只是想这样做,似乎没有隐式排序。我做了以下更明确的说明:

Something.OrderBy(e=>e.SomeFlag ? 0 : 1) 

对真假进行排序。


27
我比内置方式更喜欢这种方式。主要是因为即使隐式地对true / false排序,对于以前从未使用过的人也不是很明显。因此,一个不知道将来会看代码的人可能会认为它的排序是true到false,而实际上它的排序是false到true ...至少使用此解决方案,该代码使您可以痛苦地清楚地知道要使用哪种排序方式。
罗伯特·诺亚克

2
是的,我喜欢用代码!如果您必须使用msdn或stackoverflow来阅读文档以理解代码,那么我认为它并不是很棒的代码
JonnyRaa 2013年

2
我闻起来像魔术数字。我以为每个程序员都应该非常了解布尔值true意味着我错了a single bit set to 1吗?对我来说,事实真相true > false是显而易见的。
梅尔斯,2014年

4
@梅尔斯不是魔术数字。显式值仅用于排序和排序。值可以是42和69,重点是代码的读者知道其中一个较小,因此将是第一个。代码的阅读者可能不知道OrderBy会以哪种方式放置布尔值-将true放在首位,将false放在首位。true > false并不是众所周知的,而1 > 0实际上是。
Dan F

9
请注意,.OrderBy(e => e.SomeFlag == true)这将等效于,.OrderBy(e => e.SomeFlag).OrderBy(e => e.SomeFlag ? 0 : 1)等价于.OrderByDescending(e => e.SomeFlag)。前两个在true之前对false进行排序,其他两个在false之前对true进行排序。
EriF89 '16


0

为了更明确地说明所使用的顺序。

Something.OrderBy(e => e.SomeFlag, new BooleanComparer());

public class BooleanComparer : IComparer<bool>
{
    public int Compare(bool x, bool y)
    {
        int p = x ? 1 : 0;
        int q = y ? 1 : 0;
        return p - q; 
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.