代码之家  ›  专栏  ›  技术社区  ›  Abe Miessler

如何按特定成员对对象列表进行排序?

  •  7
  • Abe Miessler  · 技术社区  · 15 年前

    假设我有个人对象列表:

    class person
    {
      int id;
      string FirstName;
      string LastName;
    }
    

    我如何按姓氏成员对该列表进行排序?

    List<Person> myPeople = GetMyPeople();
    myPeople.Sort(/* what goes here? */);
    
    7 回复  |  直到 15 年前
        1
  •  14
  •   tanascius    15 年前

    在C 3.0下,可以使用以下LINQ语句:

    var sortedEnumerable = myPeople.OrderBy( p => p.LastName );
    
        2
  •  15
  •   Dan Tao    15 年前

    List<T>.Sort 将在适当的位置对列表进行排序。如果这就是你想要的,甜心:用 the overload that takes a Comparison<T> delegate :

    List<Person> myPeople = GetMyPeople();
    myPeople.Sort((x, y) => x.LastName.CompareTo(y.LastName));
    

    如果您不想修改实际列表,但想按排序顺序枚举其内容,则如其他人建议的那样,使用 the LINQ extension method OrderBy (NET 3.5及更高版本)。这个方法可以采取一个简单的 Func<T, TKey> 选择器并按此选择器的键排序…你知道,选择。

    List<Person> myPeople = GetMyPeople();
    var orderedByLastName = myPeople.OrderBy(p => p.LastName);
    
        3
  •  3
  •   Dexter    15 年前

    正如其他人所建议的,您可以使用自定义 IComparer 方法对列表进行排序。如果你只做一次,最简单的方法就是使用匿名方法,比如:

    List<Person> myPeople = GetMyPeople();
    myPeople.Sort(delegate(Person one, Person two)
    {
        return one.LastName.CompareTo(two.LastName);
    });
    

    或者,您可以实现 IComparable 在您的Person类上,这样类就知道如何对自己进行排序:

    class Person : IComparable<Person>
    {
        int id;
        string FirstName;
        string LastName;
    
        public int CompareTo(Person other)
        {
            return LastName.CompareTo(other.LastName);
        }
    }
    
        4
  •  2
  •   Kobi    15 年前

    一种选择是编写比较器:

    class LastNameComparer : IComparer<Person>
    {
       public int Compare(Person x, Person y)
       {
           return String.Compare(x.LastName, y.LastName);
       }
    }
    

    然后

    myPeople.Sort(new LastNameComparer());
    

    Person 也可以实施 IComparable<Person> ,在这种情况下 myPeople.Sort() 就够了。但是,您可能希望按其他位置上的其他属性排序,因此这不是常规方法;如果您希望按 ID 在另一份报告上你可以写另一份 IComparer ,但是你只能有一个 IComparable<Person>.CompareTo(Person other) 方法。

    如果你觉得懒惰,或者确定不会再使用它,你也可以使用lambda:

    myPeople.Sort((p1, p2) => String.Compare(p1.LastName, p2.LastName));
    
        5
  •  1
  •   Femaref    15 年前

    风俗习惯 IComparer<person> . 如果您使用的是C 3.0和.net3.5,请查看LINQ方法,尤其是 IEnumerable<T>.OrderBy() .

        6
  •  1
  •   MikeTWebb    15 年前

    iCompare示例

       /// <summary>
       /// Sort class on LastName Descending Order
       /// </summary>
       private class PersonLastNameDescending : IComparer<Person>
       {
          public int Compare(Person aX, Person aY)
          {
             return aY.LastName.CompareTo(aX.LastName);
          } // end Compare(...)
       } // end inner class PersonLastNameDescending 
    
       MyPeople.Sort(new PersonLastNameDescending());
    
        7
  •  0
  •   Manish Basantani    15 年前

    如果类实现了 IComparable .

    检查这个 link 细节。

    代码:

    class person : IComparable<person>
    { 
      int id; 
      string FirstName; 
      string LastName; 
    
    public int CompareTo(person other)
        {
            //If you want to sort on FirstName
            return FirstName.CompareTo(other.FirstName);
        }
    
    
    } 
    
    推荐文章