📌  相关文章
📜  如何在 C# 中按特定属性对对象数组进行排序?

📅  最后修改于: 2022-05-13 01:54:37.241000             🧑  作者: Mango

如何在 C# 中按特定属性对对象数组进行排序?

排序基本上意味着以特定顺序排列给定的一组元素。有两种顺序,我们可以按升序或降序对给定的元素集进行排序。例如,我们有一个 [2, 3, 16, 10] 的集合,现在我们可以对这组元素进行升序排序,即 [2, 3, 10, 16] 或者我们可以对这组元素进行降序排序根据我们的要求,顺序为 [16, 10, 3, 2]。在 C# 中,我们可以使用以下方式按特定属性对对象数组进行排序:

  • 数组.sort()
  • LINQ 查询

Array.sort() 方法

Array.sort() 方法用于对数组的元素进行排序。该方法共有 17 个重载版本,我们可以使用以下方法按特定属性对对象数组进行排序。

句法:

这里, 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