Řazení dat (C#)
Operace řazení objedná prvky sekvence na základě jednoho nebo více atributů. Prvním kritériem řazení je primární řazení prvků. Zadáním druhého kritéria řazení můžete řadit prvky v rámci každé primární skupiny řazení.
Důležité
Tyto ukázky používají System.Collections.Generic.IEnumerable<T> zdroj dat. Zdroje dat založené na System.Linq.IQueryProvider použití System.Linq.IQueryable<T> zdrojů dat a stromů výrazů Stromy výrazů mají omezení povolené syntaxe jazyka C#. Každý zdroj dat, například EF Core, IQueryProvider
může navíc uplatňovat další omezení. Projděte si dokumentaci ke zdroji dat.
Následující obrázek znázorňuje výsledky abecední operace řazení v posloupnosti znaků:
Standardní metody operátoru dotazu, které seřadí data, jsou uvedeny v následující části.
Metody
Název metody | Popis | Syntaxe výrazu dotazu jazyka C# | Další informace |
---|---|---|---|
OrderBy | Seřadí hodnoty ve vzestupném pořadí. | orderby |
Enumerable.OrderBy Queryable.OrderBy |
OrderByDescending | Seřadí hodnoty v sestupném pořadí. | orderby … descending |
Enumerable.OrderByDescending Queryable.OrderByDescending |
PakBy | Provede sekundární řazení ve vzestupném pořadí. | orderby …, … |
Enumerable.ThenBy Queryable.ThenBy |
PotomByDescending | Provede sekundární řazení v sestupném pořadí. | orderby …, … descending |
Enumerable.ThenByDescending Queryable.ThenByDescending |
Stornovat | Vrátí pořadí prvků v kolekci. | Nevztahuje se. | Enumerable.Reverse Queryable.Reverse |
Poznámka:
Následující příklady v tomto článku používají společné zdroje dat pro tuto oblast.
Každý z nich Student
má úroveň známek, primární oddělení a řadu výsledků. A Teacher
má City
také vlastnost, která identifikuje areál, kde učitel má předměty. A Department
má jméno a odkaz na Teacher
toho, kdo slouží jako vedoucí oddělení.
Ukázkové datové sady najdete ve zdrojovém úložišti.
public enum GradeLevel
{
FirstYear = 1,
SecondYear,
ThirdYear,
FourthYear
};
public class Student
{
public required string FirstName { get; init; }
public required string LastName { get; init; }
public required int ID { get; init; }
public required GradeLevel Year { get; init; }
public required List<int> Scores { get; init; }
public required int DepartmentID { get; init; }
}
public class Teacher
{
public required string First { get; init; }
public required string Last { get; init; }
public required int ID { get; init; }
public required string City { get; init; }
}
public class Department
{
public required string Name { get; init; }
public int ID { get; init; }
public required int TeacherID { get; init; }
}
Primární vzestupné řazení
Následující příklad ukazuje použití orderby
klauzule v dotazu LINQ k seřazení pole učitelů podle jména rodiny ve vzestupném pořadí.
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
Ekvivalentní dotaz napsaný pomocí syntaxe metody je uvedený v následujícím kódu:
IEnumerable<string> query = teachers
.OrderBy(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
Primární sestupné řazení
Další příklad ukazuje, jak pomocí orderby descending
klauzule v dotazu LINQ seřadit učitele podle rodinného jména v sestupném pořadí.
IEnumerable<string> query = from teacher in teachers
orderby teacher.Last descending
select teacher.Last;
foreach (string str in query)
{
Console.WriteLine(str);
}
Ekvivalentní dotaz napsaný pomocí syntaxe metody je uvedený v následujícím kódu:
IEnumerable<string> query = teachers
.OrderByDescending(teacher => teacher.Last)
.Select(teacher => teacher.Last);
foreach (string str in query)
{
Console.WriteLine(str);
}
Sekundární vzestupné řazení
Následující příklad ukazuje použití orderby
klauzule v dotazu LINQ k provedení primárního a sekundárního řazení. Učitelé jsou seřazeni primárně podle města a za druhé podle svého rodinného jména, a to jak ve vzestupném pořadí.
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
Ekvivalentní dotaz napsaný pomocí syntaxe metody je uvedený v následujícím kódu:
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenBy(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
Sekundární sestupné řazení
Další příklad ukazuje použití orderby descending
klauzule v dotazu LINQ k provedení primárního řazení, vzestupně a sekundárního řazení v sestupném pořadí. Učitelé jsou seřazeni především podle města a za druhé podle svého rodinného jména.
IEnumerable<(string, string)> query = from teacher in teachers
orderby teacher.City, teacher.Last descending
select (teacher.Last, teacher.City);
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}
Ekvivalentní dotaz napsaný pomocí syntaxe metody je uvedený v následujícím kódu:
IEnumerable<(string, string)> query = teachers
.OrderBy(teacher => teacher.City)
.ThenByDescending(teacher => teacher.Last)
.Select(teacher => (teacher.Last, teacher.City));
foreach ((string last, string city) in query)
{
Console.WriteLine($"City: {city}, Last Name: {last}");
}