如何在 C# 中按特定属性对对象数组进行排序?
排序基本上意味着以特定顺序排列给定的一组元素。有两种顺序,我们可以按升序或降序对给定的元素集进行排序。例如,我们有一个 [2, 3, 16, 10] 的集合,现在我们可以对这组元素进行升序排序,即 [2, 3, 10, 16] 或者我们可以对这组元素进行降序排序根据我们的要求,顺序为 [16, 10, 3, 2]。在 C# 中,我们可以使用以下方式按特定属性对对象数组进行排序:
- 数组.sort()
- LINQ 查询
Array.sort() 方法
Array.sort() 方法用于对数组的元素进行排序。该方法共有 17 个重载版本,我们可以使用以下方法按特定属性对对象数组进行排序。
句法:
Sort(array, IComparer) Method
这里, array表示一个必须排序的数组,而IComparer是一个通用接口。
异常:它会抛出以下异常:
- ArgumentNullException:当传递的数组为空时。
- InvalidOperationException:如果数组中的一个或多个元素不遵循 IComparable
通用接口。
例子:在这个程序中,数组students的元素是Student类型的。它们已根据每个学生的姓氏进行排序。该逻辑在 StudentComparer 类方法的 Compare() 方法中实现。
C#
// C# program to sort object array by specific property
using System;
using System.Collections;
class GFG{
// Comparator class
// to sort according to last name
class StudentComparer : IComparer
{
public int Compare(object x, object y)
{
return(new CaseInsensitiveComparer()).Compare(((Student)x).LastName,
((Student)y).LastName);
}
}
// Student class
class Student
{
public int Id
{
get;
set;
}
public string FirstName
{
get;
set;
}
public string LastName
{
get;
set;
}
}
// Driver code
static public void Main()
{
// Initializing an array of Student type
Student[] students = {
// Initializing using constructors
new Student(){ FirstName = "Bhuwanesh",
LastName = "Nainwal" },
new Student(){ FirstName = "Anil",
LastName = "Thapa" },
new Student(){ FirstName = "Hitesh",
LastName = "Kumar" }
};
// Calling sort method by passing comparator
// function as an argument
Array.Sort(students, new StudentComparer());
// Print array elements
foreach(var item in students)
{
Console.WriteLine(item.FirstName + ' ' +
item.LastName);
}
}
}
C#
// C# program to sort object array by specific property
using System;
using System.Collections;
class GFG{
// Comparator class
// to sort according to last name
class StudentComparer : IComparer
{
public int Compare(object x, object y)
{
return(new CaseInsensitiveComparer()).Compare(((Student)x).LastName,
((Student)y).LastName);
}
}
// Student class
class Student
{
public int Id
{
get;
set;
}
public string FirstName
{
get;
set;
}
public string LastName
{
get;
set;
}
}
// Driver code
static public void Main()
{
// Initializing an array of Student type
Student[] students = {
// Initializing using constructors
new Student(){ FirstName = "Bhuwanesh",
LastName = "Nainwal" },
new Student(){ FirstName = "Anil",
LastName = "Thapa" },
new Student(){ FirstName = "Hitesh",
LastName = "Kumar" }
};
// Calling sort method by passing comparator
// function as an argument
Array.Sort(students, new StudentComparer());
// Print array elements
foreach(var item in students)
{
Console.WriteLine(item.FirstName + ' ' +
item.LastName);
}
}
}
Hitesh Kumar
Bhuwanesh Nainwal
Anil Thapa
使用 LINQ 查询
我们还可以使用 LINQ 查询对对象数组进行排序。 LINQ 查询语法以 from 关键字开始,以 Selector GroupBy 关键字结束。使用 from 关键字后,您可以根据查询的需要,使用不同类型的标准查询操作,如过滤、分组等。
方法:
1.首先我们需要在代码中添加 System.Linq 命名空间。
using System.Linq;
2.然后,我们需要创建一个元素或数据源的集合,我们将在这些元素或数据源上执行操作。例如:
List list = new List(){
{"FirstName1", "LastName1"},
{"FirstName2", "LastName2"},
{"FirstName3", "LastName3"},
{"FirstName4", "LastName4"}
};
在这里,每个元素的类型都是 student 并且具有以下数据成员:FirstName 和 LastName
3.然后,我们将使用 orderby、select 等查询关键字创建查询。例如:
var qry = from s in list
orderby s.FirstName/LastName
select s;
这里 qry 是将存储查询表达式结果的查询变量。 from 子句用于指定数据源,即list,orderby 子句将它们排列成指定的顺序,select 子句提供返回项的类型。
4.最后一步是使用 foreach 循环执行查询。例如:
Array.ForEach(qry.ToArray(),
s => Console.WriteLine(s.FirstName + " " +
s.LastName));
示例:在这个程序中,我们根据 LastName 属性对给定的元素数组(学生类型)进行了排序。
C#
// C# program to sort object array by specific property
using System;
using System.Collections;
class GFG{
// Comparator class
// to sort according to last name
class StudentComparer : IComparer
{
public int Compare(object x, object y)
{
return(new CaseInsensitiveComparer()).Compare(((Student)x).LastName,
((Student)y).LastName);
}
}
// Student class
class Student
{
public int Id
{
get;
set;
}
public string FirstName
{
get;
set;
}
public string LastName
{
get;
set;
}
}
// Driver code
static public void Main()
{
// Initializing an array of Student type
Student[] students = {
// Initializing using constructors
new Student(){ FirstName = "Bhuwanesh",
LastName = "Nainwal" },
new Student(){ FirstName = "Anil",
LastName = "Thapa" },
new Student(){ FirstName = "Hitesh",
LastName = "Kumar" }
};
// Calling sort method by passing comparator
// function as an argument
Array.Sort(students, new StudentComparer());
// Print array elements
foreach(var item in students)
{
Console.WriteLine(item.FirstName + ' ' +
item.LastName);
}
}
}
Hitesh Kumar
Bhuwaneh Nainwal
Anil Thapa