C # LINQ Orderby-comment true / false affecte-t-il orderby?

J'étudiais un peu la commande LINQ car j'ai une liste d'identifiants, et je dois les commander séquentiellement. Cependant, certains ID doivent avoir la priorité sur l'ordre standard.

Étant donné ce code C# (qui peut être collé dans . NET Fiddle pour tester) la commande fonctionne comme j'en ai besoin, mais je ne comprends pas pourquoi un opérateur not (!) sur un contient me donne le bon ordre?

MA sortie de commande attendue est (5, 1, 2, 3, 4, 6, 7, 8, 9).

Si j'ai un Contains dans ma commande, ne devrait-il pas donner la priorité de commande aux lignes qui ont renvoyé true? Au lieu de cela, il semble donner la priorité de commande aux lignes qui renvoient false.

using System.Linq;
using System;

public class Program
{
  public static void Main()
  {
    var numbersToFilterBy = new [] {5, 11, 20};

    var x = new [] {new XClass(){Id = 1}, new XClass(){Id = 9}, new XClass(){Id = 5}, new XClass(){Id = 3}, new XClass(){Id = 4}, new XClass(){Id = 2}, new XClass(){Id = 6}, new XClass(){Id = 8}, new XClass(){Id = 7}};

    var trueData = (from data in x
                   orderby !numbersToFilterBy.Contains(data.Id), data.Id
                    select data).ToList();

    foreach(var item in trueData){
        Console.WriteLine(item.Id);
  }
}

public class XClass{
    public int Id{get;set;}
  }
}

Quelle est l'explication de pourquoi cela se produit?

23
demandé sur Peter Mortensen 2016-08-23 09:35:16

4 réponses

La méthodeOrderBy trie les élémentsdans l'ordre croissant Par Défaut . Maintenant, étant donné que la représentation numérique d'un booléen est:

  • false = 0
  • true = 1

false les valeurs viendront naturellement en premier. Si vous voulez inverser l'ordre, utilisez simplement le mot-clé descending:

var trueData = (from data in x
               orderby numbersToFilterBy.Contains(data.Id) descending, data.Id
                select data).ToList();
32
répondu Sebastian Siemens 2016-08-23 06:44:03

Fondamentalement, {[0] } est antérieur à true... pensez à eux comme des faux=0, vrai=1. Ceci est conforme à la documentation pour bool.CompareTo(bool).

Si vous voulez prioriser les valeurs" vraies " au début, utilisez simplement OrderByDescending à la place.

20
répondu Jon Skeet 2016-08-23 06:37:22

L'ordre ne concerne pas priorité – il s'agit de valeur ordinale. Vous faites un ordre croissant Par rapport à une valeur booléenne, et false a une valeur ordinale inférieure à true dans ce contexte.

6
répondu mirichan 2016-08-23 06:39:58

Laissez-moi vous expliquer cela avec un exemple de List<bool>. Considérez l'extrait suivant:

List<bool> BoolList = new List<bool>() { true, false, false, true };
var opList = BoolList.OrderBy(x => x).ToList();

Enfin, la opList aura la valeur que false,false,true,true ce qui signifie faux venir en premier lorsque nous appliquons OrderBy sur une liste de valeurs booléennes. C'est parce que false est considéré comme 0 et true sera 1.

Dans votre cas, la liste est d'abord triée comme 5,1,9,3,4,2,6,8,7 en fonction du orderby !numbersToFilterBy.Contains(data.Id) puis par data.Id vous donnera le résultat exact comme 5, 1, 2, 3, 4, 6, 7, 8, 9.

Si vous supprimez le ! de la OrderBy il vous donne le premier résultat de tri comme 1,9,3,4,2,6,8,7,5 puisque la condition est vraie pour 5 par conséquent, il viendra en dernier dans l'ordre.

3
répondu sujith karivelil 2016-08-23 10:38:08