Linq按布尔顺序排序

mat*_*lin 105 c# linq

我有一个linq查询,我想通过f.bar订购,这是一个字符串,但我也想通过f.foo订购它,这是一个布尔字段,首先.喜欢下面的查询.

(from f in foo
orderby f.foo, f.bar
select f)
Run Code Online (Sandbox Code Playgroud)

虽然这个编译它没有按预期工作.它只是通过f.bar命令忽略布尔字段.

我知道,我是愚蠢的,但是我需要做些什么才能得到这种行为?

谢谢

Jon*_*eet 168

这应该工作正常 - 它应该首先命令具有falsefoo值的实体,然后是具有truefoo值的实体.

这肯定适用于LINQ to Objects - 您实际使用的LINQ提供程序是什么?

这是一个LINQ to Objects示例,它可以工作:

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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 史诗失败......刚才意识到这是因为bug意味着f.foo总是错误的......所以很尴尬 (48认同)
  • @Sipo:作为`data.OrderBy(d => dx).ThenBy(d => dy)` (4认同)
  • 正确,`false`(0)在升序(默认)排序顺序之前出现在'true`(1)之前. (3认同)
  • @OracularMan:我建议你用一个详细的例子提出一个新问题。 (2认同)

Jon*_*Raa 106

只是想这样做,似乎没有隐含的顺序.我做了以下更明确的事情:

Something.OrderBy(e=>e.SomeFlag ? 0 : 1) 
Run Code Online (Sandbox Code Playgroud)

将某些东西归为真.

  • 我有点像内置的方式.主要是因为即使有一个隐含的真/假排序,对于之前没有做过的人来说,这并不是很明显.因此,那些不知道将来看代码的人可能会认为它真的是假的,当真的把它归结为真的时候......至少在这个解决方案中,代码会让你很明显地想要排序的方式. (25认同)
  • 注意`.OrderBy(e => e.SomeFlag == true)`相当于`.OrderBy(e => e.SomeFlag)`而``.OrderBy(e => e.SomeFlag?0:1)`相当于`.OrderByDescending(e => e.SomeFlag)`.前两个在true之前排序错误,另外两个在false之前排序为true. (9认同)
  • @Mels不是魔术数字.仅用于排序和排序的显式值.值可以是42和69,关键是代码的读者知道其中一个更小,因此将是第一个.代码的读者可能不知道OrderBy将bools放在哪个方向 - 将首先是真的,或者首先是假的.`true> false`不是普遍知道的,而`1> 0`是. (3认同)
  • 是的,我喜欢在代码中!如果你必须进入msdn或stackoverflow来阅读文档以理解代码,那么在我看来它不是很好的代码 (2认同)
  • 闻起来像魔术数字给我.我错误地认为每个程序员都应该天生就知道布尔值"true"意味着"单个位设置为1"?对我而言,"真实>虚假"的真实性是尽可能明显的. (2认同)
  • VB6中的@Mels“true”的值为-1:http://stackoverflow.com/questions/4275800/what-are-the-integer-values-of-boolean-false-and-true-in-vb6 任何非零值可以被视为“true”。 (2认同)
  • @Steve EriF89 说的是真的,但我认为你误解了它。它强调了将布尔值视为数字的问题(这可能会令人困惑!)。我的答案中的逻辑是“如果某个标志 == 真返回 0 否则返回 1”,因此它确实使用升序将真到假排序 (2认同)