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?
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();
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.
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.
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.