【问题标题】:Sort ArrayList by Object field value按对象字段值对 ArrayList 进行排序
【发布时间】:2026-02-05 22:30:02
【问题描述】:

所以我的 ArrayList 看起来像这样:

        using System.Collections;
        [...]
        //in main:
        Student s01 = new Student
        {
            name = "John",
            surname = "Doa"
        };

        Student s02 = new Student
        {
            name = "John",
            surname = "Doe"
        };

        Student s03 = new Student
        {
            name = "John",
            surname = "Doi"
        };

        Student s04 = new Student
        {
            name = "John",
            surname = "Doo"
        };

        Student s05 = new Student
        {
            name = "John",
            surname = "Dou"
        };

        ArrayList studentsList = new ArrayList();
        studentsList.Add(s03);
        studentsList.Add(s04);
        studentsList.Add(s05);
        studentsList.Add(s01);
        studentsList.Add(s02);

学生.cs:

class Student : IPerson
{
    public string name;
    public string surname;

    public void Describe()
    {
        Console.WriteLine("{0} {1}", name, surname);
    }

我想按surnamestudentsList 中的对象进行排序,并在foreach 循环中写下姓名+姓氏。我知道studentsList.Sort(); 不起作用,因为它不知道应该以什么方式将每个对象与其他对象进行比较- 这就是我卡住的地方,因为我真的不知道如何编写使用 arrayList 中对象字段值的新比较器。我什至不知道如何开始。

我必须使用 ArrayList,但我不必直接对其进行排序(我猜我可以使用强制转换) - 最后它必须看起来像:

1. John Doa
2. John Doe
3. John Doi
4. John Doo
5. John Dou

Sort()studentsList 会很棒,因为我可以这样做:

int i = 0;
foreach (Student s in studentsList)
{
   i++;
   Console.Write("{0}. ", i);
   s.Describe();
}

【问题讨论】:

  • 为什么必须使用 ArrayList?这是作业吗?
  • 那种。这是一项测试任务,我为此而学习。
  • 您还需要添加 using System.Linq 才能使用它。
  • 您好像错过了OfType<Student>() 电话。但请注意,ArrayList 现在很少在实际代码中使用 - 自 2005 年以来它已经基本过时了。

标签: c# sorting arraylist


【解决方案1】:

您还可以在 Student 中定义 compareTo 方法,以便能够使用 studentList.Sort() 。 学生类也应该扩展 :IComparable

  public int CompareTo(object obj)
  {
        if (obj == null) return 1;
        Student other = obj as Student;
        if (other != null)
        {
            // Compare last names first, then by firstName
            int value = this.lastName.CompareTo(other.lastName);
            if (value == 0)
                value = this.firstName.CompareTo(other.firstName);
            return value;
        }
        else
            throw new ArgumentException("Object is not a Student");
  }

【讨论】:

  • 是的,效果很好 - 不像 linq 表达式那么简单,但是 .Sort() 有效;)
【解决方案2】:

你可以这样做

        ArrayList studentsList = new ArrayList();
        studentsList.Add(s03);
        studentsList.Add(s04);
        studentsList.Add(s05);
        studentsList.Add(s01);
        studentsList.Add(s02);

        var studentsList2 = studentsList.Cast<Student>().OrderBy(r => r.surname).ToList();

        int i = 0;
        foreach (Student s in studentsList2)
        {
            i++;
            Console.Write("{0}. ", i);
            s.Describe();
        }

【讨论】:

  • 该语句不会产生任何效果 - 您需要使用调用的结果。
  • 也可以,但建议@Will 的更好,因为我不必使用间接排序(使用列表)。
【解决方案3】:
foreach (var student in studentsList.OfType<Student>().OrderBy(x => x.surname).ThenBy(x => x.name))
        {
            i++;
            Console.Write("{0}. ", i);
            student.Describe();
        }

正常工作(感谢@Will,https://*.com/users/1228/will),我没有意识到 linq 表达式会那么容易。话虽这么说,这只是学术上的例子,因为 ArrayList 自 2005 年以来大部分已过时(@JonSkeet)。

【讨论】: