📌  相关文章
📜  c# 对对象列表进行排序 - C# (1)

📅  最后修改于: 2023-12-03 14:39:46.200000             🧑  作者: Mango

C# 对象列表排序

在 C# 中,我们可以使用 LINQ(语言集成查询)来对对象列表进行排序。在本篇文章中,我们将探讨两种常见的排序方式:按照属性和自定义排序。

按照属性排序

假设我们有以下一个名为 Person 的类:

public class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

我们有一个 Person 对象的列表,我们希望按照 Age 属性进行排序。下面是如何使用 LINQ 来实现:

List<Person> people = new List<Person>() {
    new Person { Name = "Alice", Age = 25 },
    new Person { Name = "Bob", Age = 20 },
    new Person { Name = "Charlie", Age = 30 }
};

var sortedPeople = people.OrderBy(p => p.Age);

foreach (var person in sortedPeople) {
    Console.WriteLine($"{person.Name} ({person.Age})");
}

这将输出:

Bob (20)
Alice (25)
Charlie (30)

我们使用 OrderBy() 方法来排序,参数是一个 lambda 表达式,用于指定要排序的属性。在这个例子中,我们传递了 p => p.Age 作为 lambda 表达式,表示按照 Age 属性进行排序。

我们也可以按照 Name 属性进行排序,只需要将 lambda 表达式传递给 OrderBy() 方法即可:

var sortedPeople = people.OrderBy(p => p.Name);

foreach (var person in sortedPeople) {
    Console.WriteLine($"{person.Name} ({person.Age})");
}

这将输出:

Alice (25)
Bob (20)
Charlie (30)
自定义排序

有时候,我们的排序需求可能更加复杂,需要按照一定的逻辑进行排序。这时候,我们可以使用 OrderBy() 方法的重载版本,它接受一个 IComparer<T> 对象,用于自定义排序逻辑。

假设我们要按照以下逻辑进行排序:

  1. 年龄小于 20 的人排在最前面
  2. 年龄在 20~30 之间的人按照姓名字典序排序
  3. 年龄大于 30 的人按照年龄倒序排序

下面是如何实现:

public class CustomComparer : IComparer<Person> {
    public int Compare(Person x, Person y) {
        // 年龄小于 20 的人排在最前面
        if (x.Age < 20 && y.Age < 20) {
            return 0;
        } else if (x.Age < 20) {
            return -1;
        } else if (y.Age < 20) {
            return 1;
        }

        // 年龄在 20~30 之间的人按照姓名字典序排序
        if (x.Age >= 20 && x.Age <= 30 && y.Age >= 20 && y.Age <= 30) {
            return x.Name.CompareTo(y.Name);
        }

        // 年龄大于 30 的人按照年龄倒序排序
        if (x.Age > 30 && y.Age > 30) {
            return y.Age.CompareTo(x.Age);
        } else if (x.Age > 30) {
            return -1;
        } else if (y.Age > 30) {
            return 1;
        }

        return 0;
    }
}

// 使用自定义 comparer 进行排序
var sortedPeople = people.OrderBy(p => p, new CustomComparer());

foreach (var person in sortedPeople) {
    Console.WriteLine($"{person.Name} ({person.Age})");
}

这将输出:

Bob (20)
Alice (25)
Charlie (30)

我们首先实现了一个实现了 IComparer<Person> 接口的类 CustomComparer,它定义了自定义的排序逻辑。然后,在调用 OrderBy() 方法时,我们传递了 new CustomComparer() 作为第二个参数,以使用自定义的 comparer 进行排序。