web-dev-qa-db-fra.com

Linq ordre par booléen

J'ai une requête linq que je veux commander par f.bar, qui est une chaîne, mais je veux aussi la commander par f.foo, qui est d'abord un champ booléen. Comme la requête ci-dessous. 

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

Bien que cela compile, cela ne fonctionne pas comme prévu. Il ordonne simplement à f.bar d'ignorer le champ booléen.

Je suis stupide, je sais, mais que dois-je faire pour avoir ce comportement?

Merci

96
mat-mcloughlin

Cela devrait fonctionner correctement - les entités avec une valeur false foo en premier doivent être classées en premier lieu, puis celles avec une valeur true foo.

Cela fonctionne certainement dans LINQ to Objects - quel fournisseur LINQ utilisez-vous réellement?

Voici un exemple de LINQ to Objects qui fait travail:

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

}
150
Jon Skeet

Je voulais juste faire cela et cela ressemble à quelque chose sans ordre implicite. J'ai fait ce qui suit pour être plus explicite:

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

trier quelque chose de vrai à faux.

93
JonnyRaa

Afin d'être plus explicite sur l'ordre utilisé. 

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
Wouter