descending - C#LINQ Orderby-¿Cómo afecta true/false a orderby?
order by linq c# list (4)
Básicamente, false
es anterior a true
... piense en ellos como falso = 0, verdadero = 1. Esto bool.CompareTo(bool)
con la documentación de bool.CompareTo(bool)
.
Si desea priorizar los valores "verdaderos" al inicio, solo use OrderByDescending
en OrderByDescending
lugar.
Estaba estudiando un poco de pedido de LINQ ya que tengo una lista de identificadores, y necesito ordenarlos secuencialmente. Sin embargo, hay ciertos identificadores que deben tener prioridad sobre el orden estándar.
Dado este código C # (que se puede pegar en .NET Fiddle para probar) el pedido funciona como lo necesito, pero no entiendo por qué un operador no ( !
) En un contenedor me está dando el pedido correcto.
Mi salida de pedido esperada es ( 5, 1, 2, 3, 4, 6, 7, 8, 9
).
Si tengo un Contains
en mi pedido, ¿no debería dar prioridad de pedido a las filas que devolvieron verdadero? En cambio, parece dar prioridad de orden a las filas que devuelven falso.
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;}
}
}
¿Cuál es la explicación de por qué sucede esto?
Déjame explicarte esto con un ejemplo de una List<bool>
. Considere el siguiente fragmento de código:
List<bool> BoolList = new List<bool>() { true, false, false, true };
var opList = BoolList.OrderBy(x => x).ToList();
finalmente, el opList
tendrá los valores como false
, false
, true
, true
, lo que significa que falso es lo primero cuando aplicamos OrderBy sobre una lista de valores booleanos. Esto se debe a que falso se considera como 0
y verdadero será 1
.
En su caso, la lista se clasifica primero como 5,1,9,3,4,2,6,8,7
según el orden orderby !numbersToFilterBy.Contains(data.Id)
luego data.Id
le dará el resultado exacto como 5, 1, 2, 3, 4, 6, 7, 8, 9
.
Si eliminas el !
de OrderBy
le da el primer resultado de clasificación como 1,9,3,4,2,6,8,7,5
ya que la condición es verdadera para 5
por lo tanto, será la última en el pedido.
El método OrderBy ordenará los artículos en orden ascendente de forma predeterminada . Ahora, dado que la representación numérica de un booleano es:
-
false
= 0 -
true
= 1
false
valores false
naturalmente vendrán primero. Si desea invertir el orden, use la palabra clave descending
:
var trueData = (from data in x
orderby numbersToFilterBy.Contains(data.Id) descending, data.Id
select data).ToList();
El pedido no tiene que ver con la prioridad , se trata del valor ordinal . Estás haciendo un orden ascendente contra un valor booleano, y false
tiene un valor ordinal más bajo que true
en ese contexto.