Linq ordenar por boolean


Tengo una consulta linq que quiero ordenar por f.bar, que es una cadena, pero también quiero ordenarla por f.foo, que es un campo booleano, primero. Como la consulta a continuación.

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

Aunque esto compila no funciona como se esperaba. Solo ordena por f. bar ignorando el campo booleano.

Estoy siendo tonto, lo sé, pero ¿qué necesito hacer para obtener este comportamiento?

Gracias

 90
Author: mat-mcloughlin, 2011-03-23

3 answers

Eso debería funcionar bien - debería ordenar primero las entidades con un valor false foo, luego aquellas con un valor true foo.

Eso ciertamente funciona en LINQ to Objects - ¿qué proveedor de LINQ está utilizando realmente?

Aquí hay un ejemplo de LINQ to Objects que funciona :

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

}
 143
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-23 16:22:22

Solo quería hacer esto y parece algo sin orden implícito. Hice lo siguiente para ser más explícito:

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

Para ordenar algo verdadero a falso.

 88
Author: Jonny Leeds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 16:45:48

Para ser más explícito sobre el orden que se está utilizando.

Something.OrderBy(e => e.SomeFlage, 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; 
    }
}
 0
Author: Wouter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-03 11:31:05