AYUDA .NET

C# Orderby (Cómo funciona para desarrolladores)

Actualizado 18 de febrero, 2024
Compartir:

La ordenación es una operación fundamental en cualquier lenguaje de programación, y el método OrderBy de C# es una potente herramienta para ordenar elementos dentro de colecciones. Tanto si trabaja con arrays, listas u otras estructuras enumerables, entender cómo aprovechar OrderBy puede mejorar enormemente la legibilidad y funcionalidad de su código.

Más adelante presentaremos IronPDF y cómo podemos utilizar el método LINQ OrderBy y IronPDF para generar PDF formateados y ordenados.

¿Qué es el método LINQ OrderBy?

El método OrderBy forma parte de LINQ (Consulta integrada en el lenguaje) en C# y está específicamente diseñado para ordenar elementos en orden ascendente, ya que es la forma por defecto de ordenar los datos, no hay necesidad de una palabra clave ascendente.

Cómo utilizar el método LINQ Orderby

Ordenación ascendente de datos

En C#, hay dos formas de aplicar este método. Mediante la sintaxis del método o la sintaxis de la consulta. Utilizaremos la sintaxis del método por ser sencilla:

var sortedCollection = collection.OrderBy(item => item.OrderByProperty);
var sortedCollection = collection.OrderBy(item => item.OrderByProperty);
Dim sortedCollection = collection.OrderBy(Function(item) item.OrderByProperty)
VB   C#

Aquí, la colección es la colección fuente IEnumerable que desea ordenar, y OrderByProperty es la propiedad o expresión por la que desea ordenar los elementos. El método de extensión de la expresión lambda dentro de OrderBy especifica el criterio de ordenación.

Ordenación descendente de datos

Para ordenar en orden descendente, puede utilizar el método OrderByDescending utilizando la sintaxis basada en métodos:

var sortedCollectionDesc = collection.OrderByDescending(item => item.OrderByProperty);
var sortedCollectionDesc = collection.OrderByDescending(item => item.OrderByProperty);
Dim sortedCollectionDesc = collection.OrderByDescending(Function(item) item.OrderByProperty)
VB   C#

Ordenación de datos por varios criterios

En el mundo real, a menudo es necesario ordenar una colección en función de varios criterios. OrderBy permite esto encadenando múltiples llamadas ThenBy o ThenByDescending:

var multiSortedCollection = collection
    .OrderBy(item => item.OrderByProperty1)
    .ThenByDescending(item => item.OrderByProperty2);
var multiSortedCollection = collection
    .OrderBy(item => item.OrderByProperty1)
    .ThenByDescending(item => item.OrderByProperty2);
Dim multiSortedCollection = collection.OrderBy(Function(item) item.OrderByProperty1).ThenByDescending(Function(item) item.OrderByProperty2)
VB   C#

En este ejemplo, la colección se ordena primero por OrderByProperty1 en orden ascendente y luego, para los elementos con el mismo valor OrderByProperty1, se ordena por OrderByProperty2 en orden descendente.

Comparadores personalizados

Para requisitos de clasificación más complejos, puede utilizar comparadores personalizados. El método OrderBy permite pasar un `IComparercomo se muestra en el siguiente ejemplo:

var customSortedCollection = collection.OrderBy(item => item.Property, new CustomComparer());
var customSortedCollection = collection.OrderBy(item => item.Property, new CustomComparer());
Dim customSortedCollection = collection.OrderBy(Function(item) item.Property, New CustomComparer())
VB   C#

Aquí, CustomComparer es una clase que implementa el `IComparerque proporciona una lógica personalizada para comparar elementos.

Ejemplo práctico: Clasificar objetos

Ordenación de una lista de números enteros

using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 5, 2, 8, 1, 7 };
        var sortedNumbers = numbers.OrderBy(num => num);
        Console.WriteLine("Sorted Numbers:");
        foreach (var number in sortedNumbers)
        {
            Console.WriteLine(number);
        }
    }
}
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 5, 2, 8, 1, 7 };
        var sortedNumbers = numbers.OrderBy(num => num);
        Console.WriteLine("Sorted Numbers:");
        foreach (var number in sortedNumbers)
        {
            Console.WriteLine(number);
        }
    }
}
Imports System
Imports System.Linq
Imports System.Collections.Generic
Friend Class Program
	Shared Sub Main()
		Dim numbers As New List(Of Integer) From {5, 2, 8, 1, 7}
		Dim sortedNumbers = numbers.OrderBy(Function(num) num)
		Console.WriteLine("Sorted Numbers:")
		For Each number In sortedNumbers
			Console.WriteLine(number)
		Next number
	End Sub
End Class
VB   C#

En este ejemplo, una lista de números enteros se ordena en orden ascendente utilizando OrderBy.

Ordenar una lista de cadenas

using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        List<string> names = new List<string> { "Alice", "Charlie", "Bob", "David" };
        var sortedNames = names.OrderBy(name => name);
        Console.WriteLine("Sorted Names:");
        foreach (var name in sortedNames)
        {
            Console.WriteLine(name);
        }
    }
}
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        List<string> names = new List<string> { "Alice", "Charlie", "Bob", "David" };
        var sortedNames = names.OrderBy(name => name);
        Console.WriteLine("Sorted Names:");
        foreach (var name in sortedNames)
        {
            Console.WriteLine(name);
        }
    }
}
Imports System
Imports System.Linq
Imports System.Collections.Generic
Friend Class Program
	Shared Sub Main()
		Dim names As New List(Of String) From {"Alice", "Charlie", "Bob", "David"}
		Dim sortedNames = names.OrderBy(Function(name) name)
		Console.WriteLine("Sorted Names:")
		For Each name In sortedNames
			Console.WriteLine(name)
		Next name
	End Sub
End Class
VB   C#

Este ejemplo demuestra la ordenación de una lista de cadenas en orden alfabético ascendente.

Ordenar una lista de objetos personalizados

using System;
using System.Linq;
using System.Collections.Generic;
class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Alice", LastName = "Smith", Age = 25 },
            new Person { FirstName = "Bob", LastName = "Johnson", Age = 35 }
        };
        var sortedPeople = people.OrderBy(person => person.Age);
        Console.WriteLine("Sorted People by Age:");
        foreach (var person in sortedPeople)
        {
            Console.WriteLine($"{person.FirstName} {person.LastName}, Age: {person.Age}");
        }
    }
}
using System;
using System.Linq;
using System.Collections.Generic;
class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Alice", LastName = "Smith", Age = 25 },
            new Person { FirstName = "Bob", LastName = "Johnson", Age = 35 }
        };
        var sortedPeople = people.OrderBy(person => person.Age);
        Console.WriteLine("Sorted People by Age:");
        foreach (var person in sortedPeople)
        {
            Console.WriteLine($"{person.FirstName} {person.LastName}, Age: {person.Age}");
        }
    }
}
Imports System
Imports System.Linq
Imports System.Collections.Generic
Friend Class Person
	Public Property FirstName() As String
	Public Property LastName() As String
	Public Property Age() As Integer
End Class
Friend Class Program
	Shared Sub Main()
		Dim people As New List(Of Person) From {
			New Person With {
				.FirstName = "John",
				.LastName = "Doe",
				.Age = 30
			},
			New Person With {
				.FirstName = "Alice",
				.LastName = "Smith",
				.Age = 25
			},
			New Person With {
				.FirstName = "Bob",
				.LastName = "Johnson",
				.Age = 35
			}
		}
		Dim sortedPeople = people.OrderBy(Function(person) person.Age)
		Console.WriteLine("Sorted People by Age:")
		For Each person In sortedPeople
			Console.WriteLine($"{person.FirstName} {person.LastName}, Age: {person.Age}")
		Next person
	End Sub
End Class
VB   C#

En este ejemplo, una lista de objetos Persona personalizados se ordena en función de la propiedad edad en orden ascendente.

En la consola aparece la siguiente salida

C# Orderby (Cómo funciona para desarrolladores): Figura 1 - Salida del código anterior ordenando objetos personalizados

Comparación de cadenas

Cuando se trata de propiedades de cadena, es posible que desee garantizar una ordenación que no distinga entre mayúsculas y minúsculas:

var sortedPeopleByName = people.OrderBy(person => person.LastName, StringComparer.OrdinalIgnoreCase);
var sortedPeopleByName = people.OrderBy(person => person.LastName, StringComparer.OrdinalIgnoreCase);
Dim sortedPeopleByName = people.OrderBy(Function(person) person.LastName, StringComparer.OrdinalIgnoreCase)
VB   C#

Este ejemplo utiliza StringComparer.OrdinalIgnoreCase para realizar una ordenación sin distinción entre mayúsculas y minúsculas basada en la propiedad LastName.

Consideraciones sobre el rendimiento

Aunque LINQ proporciona una forma concisa de ordenar colecciones, es esencial tener en cuenta las implicaciones de rendimiento, especialmente para grandes conjuntos de datos. Para situaciones en las que el rendimiento sea crítico, puede explorar alternativas como la ordenación in situ mediante la función List<T>.Sort.

Presentación de IronPDF

IronPDF es una biblioteca PDF en C# de Iron Software que ayuda a leer y generar documentos PDF. Puede convertir fácilmente documentos formateados con información de estilo a PDF. IronPDF puede generar fácilmente PDFs a partir de cadenas HTML, o puede descargar el HTML de la URL y luego generar PDFs.

Instalación

IronPDF puede instalarse mediante la aplicación NuGet o mediante el gestor de paquetes de Visual Studio.

dotnet add package IronPdf
dotnet add package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'dotnet add package IronPdf
VB   C#

También puede instalar IronPDF utilizando NuGet Package Manager buscando "ironpdf" en la barra de búsqueda de NuGet Package Manager.

C# Orderby (Cómo funciona para los desarrolladores): Figura 2 - Instalación de IronPDF a través del gestor de paquetes NuGet

Generar un PDF con IronPDF

A continuación se muestra el código para generar un informe PDF utilizando una cadena HTML y el generador IronPDF

//  Para más información, consulte https://aka.ms/new-console-template
class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Alice", LastName = "Smith", Age = 25 },
            new Person { FirstName = "Bob", LastName = "Johnson", Age = 35 }
        };
        var sortedPeople = people.OrderBy(person => person.Age);
        string name = "Sam";
        var count = people.Count;
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} people sorted by Age.</p>
" +
string.Join("\n", sortedPeople.Select(person => $"{person.FirstName} {person.LastName}, Age: {person.Age}"))
+ @"
</body>
</html>";
//  Crear un nuevo documento PDF
        var pdfDocument = new ChromePdfRenderer();
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("personByAge.pdf");
    }
}
//  Para más información, consulte https://aka.ms/new-console-template
class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { FirstName = "John", LastName = "Doe", Age = 30 },
            new Person { FirstName = "Alice", LastName = "Smith", Age = 25 },
            new Person { FirstName = "Bob", LastName = "Johnson", Age = 35 }
        };
        var sortedPeople = people.OrderBy(person => person.Age);
        string name = "Sam";
        var count = people.Count;
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} people sorted by Age.</p>
" +
string.Join("\n", sortedPeople.Select(person => $"{person.FirstName} {person.LastName}, Age: {person.Age}"))
+ @"
</body>
</html>";
//  Crear un nuevo documento PDF
        var pdfDocument = new ChromePdfRenderer();
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("personByAge.pdf");
    }
}
Imports Microsoft.VisualBasic

'  Para más información, consulte https://aka.ms/new-console-template
Friend Class Person
	Public Property FirstName() As String
	Public Property LastName() As String
	Public Property Age() As Integer
End Class
Friend Class Program
	Shared Sub Main()
		Dim people As New List(Of Person) From {
			New Person With {
				.FirstName = "John",
				.LastName = "Doe",
				.Age = 30
			},
			New Person With {
				.FirstName = "Alice",
				.LastName = "Smith",
				.Age = 25
			},
			New Person With {
				.FirstName = "Bob",
				.LastName = "Johnson",
				.Age = 35
			}
		}
		Dim sortedPeople = people.OrderBy(Function(person) person.Age)
		Dim name As String = "Sam"
		Dim count = people.Count
		Dim content As String = $"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} people sorted by Age.</p>
" & String.Join(vbLf, sortedPeople.Select(Function(person) $"{person.FirstName} {person.LastName}, Age: {person.Age}")) & "
</body>
</html>"
'  Crear un nuevo documento PDF
		Dim pdfDocument = New ChromePdfRenderer()
		pdfDocument.RenderHtmlAsPdf(content).SaveAs("personByAge.pdf")
	End Sub
End Class
VB   C#

Aquí estamos generando primero una cadena HTML a partir de sortedPeople que está ordenada en orden ascendente con todo el formato requerido para los informes. A continuación, utilizamos IronPDF para generar un documento PDF. Utilizamos el método RenderHtmlAsPdf para convertir una cadena HTML en un documento PDF.

Salida

El siguiente resultado está disponible en el PDF.

C# Orderby (Cómo funciona para desarrolladores): Figura 3 - PDF de salida del código anterior

Licencias (prueba gratuita disponible)

Puede obtener una clave de prueba en aquí. Esta clave debe colocarse en appsettings.json.

"IronPdf.LicenseKey": "your license key"
"IronPdf.LicenseKey": "your license key"
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'"IronPdf.LicenseKey": "your license key"
VB   C#

Proporcione su correo electrónico para obtener una licencia de prueba.

Conclusión

El método OrderBy en C# es una herramienta versátil para ordenar colecciones basándose en varios criterios. Tanto si está ordenando en orden ascendente o descendente, por uno o varios criterios, o utilizando comparadores personalizados, el dominio de OrderBy puede mejorar significativamente la claridad y la eficiencia de su código.

Junto con IronPDF, es una gran combinación para generar una colección bellamente formateada y ordenada como documento.

< ANTERIOR
C# Dev Kit VS Code Extension (Cómo funciona para los desarrolladores)
SIGUIENTE >
MSTest C# (Cómo funciona para desarrolladores )

¿Listo para empezar? Versión: 2024.7 recién publicada

Descarga gratuita de NuGet Descargas totales: 9,974,197 Ver licencias >
123