C# - LINQ-Orderby - Wie funktioniert true/false beeinflussen orderby?
Ich war das Studium ein bisschen LINQ Bestellung habe ich eine Liste von Ids, und ich brauche, um diese nacheinander. Es gibt jedoch bestimmte ids, müssen Vorrang vor den standard-Bestellung.
Gegeben, diese C# - code (die eingefügt werden können in .NETTO-Fiddle zu testen) die Bestellung funktioniert wie ich es brauche, aber ich verstehe nicht, warum nicht (!
) operator auf a enthält, ist, dass Sie mir die richtige Reihenfolge?
Voraussichtlich meine Bestellung Ausgang (5, 1, 2, 3, 4, 6, 7, 8, 9
).
Wenn ich eine Contains
in meiner Bestellung, sollte es nicht geben, Bestell-Priorität, um die Zeilen, die true zurück? Stattdessen scheint es zu geben, Bestell-Priorität für Zeilen, die false zurück.
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;}
}
}
Was ist die Erklärung, warum dies geschieht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den OrderBy Methode "Elemente Sortieren" in aufsteigender Reihenfolge standardmäßig. Jetzt, da die numerische Repräsentation einer booleschen wird:
false
= 0true
= 1false
Werte werden natürlich zuerst kommen. Wenn Sie möchten, um in umgekehrter Reihenfolge zu benutzen Sie einfach diedescending
Stichwort:int test = (int)true;
wirft einen compiler Ausnahme vonCannot convert type 'bool' to 'int'
. Wie sind Sie Gießen, ohne einen Fehler?CompareTo
Methoden eine Ganzzahl zurück. Seine wie Vergleiche funktionieren. Siehe msdn.microsoft.com/en-us/library/... für mehr details, aber im Grunde 0 menas Sie gleich sind, negativ bedeutet, dass die Instanz kommt, bevor der parameter und positiv bedeutet, dass die Instanz kommt nach dem parameter. Das ErgebnisCompareTo
gibt die Reihenfolge an, es wird nicht verwendet, wenn die Bestellung (dh es Sortieren nicht durch das Ergebnis der CompareTo-das ist, was es klingt wie Sie möglicherweise darauf hindeutet).Convert.ToInt32(Boolean)
konvertiertfalse
zu0
undtrue
zu1
.Boolean.CompareTo
. Es nicht konvertieren in eine Ganzzahl zu tun, ein Vergleich, der gar nicht darauf, dass man meinen könnte, der einen boolean in Bezug auf eine ganze Zahl. Es ist nur definiert, dass falsch vor wahr, wenn die Bestellung aufsteigend - keine zahlen beteiligt sind überall.Grundsätzlich
false
älter alstrue
... denke, von Ihnen als falsch=0, wahr=1 ist. Dies ist in Einklang mit der Dokumentation fürbool.CompareTo(bool)
.Wenn Sie möchten, zu priorisieren "wahre" Werte zu starten, verwenden Sie einfach
OrderByDescending
statt.Bestellung nicht über Priorität – es geht um ordinalen Wert. Du tust aufsteigender Reihenfolge gegen einen booleschen Wert, und
false
hat eine niedrigere Ordnungszahl Wert alstrue
in diesem Zusammenhang.Lassen Sie mich erklären dies mit einem Beispiel eines
List<bool>
. Betrachten Sie den folgenden Codeausschnitt:schließlich die
opList
werden die Werte alsfalse
,false
,true
,true
was bedeutet false zuerst kommen, wenn man die OrderBy-über eine Liste mit booleschen Werten. Dies ist, weil falsch ist, betrachten Sie als0
und true1
.In Ihrem Fall die Liste ist zunächst sortiert, wie
5,1,9,3,4,2,6,8,7
auf der Grundlage derorderby !numbersToFilterBy.Contains(data.Id)
dann durchdata.Id
wird Ihnen das genaue Ergebnis, als5, 1, 2, 3, 4, 6, 7, 8, 9
.Wenn Sie entfernen die
!
von derOrderBy
gibt es Sie, die erste Art Ergebnis wie1,9,3,4,2,6,8,7,5
da die Bedingung wahr ist für5
daher wird es kommen, letzten in der Reihenfolge.