multiple descending columns ascending asc c# .net linq order operators

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.