如何按整数属性对班级名单进行排序?

3

下面我创建了一个由4个Person类型元素组成的列表。我想要按照年龄属性对Person列表进行升序排列。是否有一种优雅的方法使用LINQ或IComparable(或其他方式)实现这一点,而不必从头编写自己的算法?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Person> people = new List<Person>();
            people.Add(new Person("Matthew", 27));
            people.Add(new Person("Mark", 19));
            people.Add(new Person("Luke", 30));
            people.Add(new Person("John", 20));

            // How to sort list by age?

        }

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

            public Person(string name, int age)
            {
                Name = name;
                Age = age;
            }
        }
    }
}

4
啊,那些必须的,“因为不知道要用什么关键词搜索重复问题而被踩”的情况... - cadsharp
重复警察又抓到一个... :) - user1585204
2个回答

10
people.Sort((p1, p2) =>
{
  return p1.Age - p2.Age;
});

Linq已经在OrderBy()中包含了完全相同的代码。 - Scott Selby
你确定吗?(http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,618) - manji
是的,我说得太早了,一开始我以为你有一个比较。所以你是对的,它不存在,但是int已经实现了IComparable,所以在我看来,只需使用内置的OrderBy就是最“优雅的方法来完成这个任务”。 - Scott Selby
4
OrderBy不能就地对列表进行排序。你可以与.ToList()组合使用来创建一个新的已排序列表,但它不会像这个解决方案一样对原始列表进行排序。 - recursive
我并不真正理解它是如何工作的,但这是我能够让列表按整数字段排序的唯一方法。在整数值上,.OrderBy 对我无效。 - Caverman

9

试试这个:

List<Person> SortedList = people.OrderBy(o => o.Age).ToList();

1
我反对。虽然看起来“漂亮”,但是将整个列表复制而不是对现有列表进行排序,在性能和设计上都是低效的。@manji提供了正确的答案,而不是这个答案。 - Thomas Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接