如何排序List <t>?</t>

时间:2011-08-22 07:34:18

标签: c# .net linq list sorting

  

可能重复:
  Sort a Custom Class List<>

我有一个通用收集器List和一些代码以无序方式向收集器添加CmsCategoryCmsCategory包含字段int CategoryIdstring Title

List<CmsCategory> categories = new List<CmsCategory>();
categories.Sort();

插入完成后,我需要将收集器中的所有对象按CategoryId (ascending)排序。

我收到此错误:

  

至少有一个对象必须实现IComparable。

我的问题:

  • 我在这里使用List<T&gt;做错了什么?

  • 您是否了解更适合此类操作的Generic Collector?

感谢您抽出宝贵时间。

9 个答案:

答案 0 :(得分:9)

您可以使用OrderBy()方法根据属性进行排序:

var sortedItems = categories.OrderBy(x => x.CategoryId);

如果您需要列表中的项目,可以拨打.ToList()

var sortedList = sortedItems.ToList();

使用OrderBy()的一个很酷的事情是,您也可以使用ThenBy()来基于第二个(或第三个或第四个......)属性进行排序:

var reallySortedItems = categories.OrderBy(x => x.CategoryId).ThenBy(x => x.OtherProp);

答案 1 :(得分:3)

您的自定义类型需要实现IComparable接口。

class CmsCategory: IComparable<CategoryID>
{
     public int CategoryID { get; set; }

     #region IComparable<CmsCategory> Members

     public int CompareTo( CmsCategory other )
     {
         if ( this.CategoryID < other.CategoryID ) return 1;
         else if ( this.CategoryID > other.CategoryID ) return -1;
         else return 0;
     }

     #endregion
}

或者,如果需要在不同情况下对对象的不同属性进行排序,可以创建IComparer的适当实现并将它们传递给sort方法。

class CmsCategory_SortByName : IComparer<CmsCategory>
{
    #region IComparer<CmsCategory> Members

    public int Compare( CmsCategory x, CmsCategory y )
    {
        return string.Compare( x.Name, y.Name );
    }

    #endregion
}

var customSort = new CmsCategory_SortByName();
categories.Sort(customSort);

答案 2 :(得分:2)

你可以像这样使用Linq:

List<CmsCategory> categories = new List<CmsCategory>();
categories = categories.OrderBy(c => c.CategoryId).ToList();

对于更复杂的场景,您可以使用比较:

internal class CmsCategoryComparison
{
   public static int Compare(CmsCategory a, CmsCategory b)
   {
      // return either -1, 0, 1 like the CompareTo() method would
   }
}
List<CmsCategory> categories = new List<CmsCategory>();
categories.Sort(CmsCategoryComparison.Compare);

答案 3 :(得分:1)

尝试:

categories.OrderBy(x=>x.CategoryId);

答案 4 :(得分:1)

有3种简单的方法可以做到这一点。

使用代表

class Book
{
    public Book(string id, string name, string author)
    {
        ID = id;
        Name = name;
        Author = author;
    }
    public string ID { get; set; }
    public string Name { get; set; }
    public string Author { get; set; }

}

List<Book> listBook = new List<Book>();
        listBook.Add(new Book( "103", "Code Complete", "Steve MC"  ));
        listBook.Add(new Book("101", "Effective C++", "Scott Meyers"));
        listBook.Add(new Book("102", "CLR Via C#", "Jeff Prosise"));

        listBook.Sort(
            delegate(Book a, Book b) 
            {
                return a.ID.CompareTo(b.ID);
            });

使用比较器

    static int CompareBook(Book a, Book b)
    {
        return a.ID.CompareTo(b.ID);
    }

        listBook.Sort( CompareBook );

使用IComparable

class Book : IComparable
{
    public Book(string id, string name, string author)
    {
        ID = id;
        Name = name;
        Author = author;
    }
    public string ID { get; set; }
    public string Name { get; set; }
    public string Author { get; set; }

    public int CompareTo(object obj)
    {
        return ID.CompareTo(((Book)obj).ID);
    }

}

最后,这是你的选择! :)

答案 5 :(得分:0)

您可以让CmsCategory继承IComparable,也可以使用另一个接受Compare(T)委托的Sort重载。

最后一个案例可能如下:

categories.Sort( (x,y) => { 
 if(x.CategoryId > y.CategoryId)
  return 1;
 else if(x.CategoryId == y.CategoryId)
  return 0;
 else
  return -1;
});

答案 6 :(得分:0)

您需要在IComparable<T>

中实施CmsCategory
class CmsCategory : IComparable<CmsCategory>
{
    public int CompareTo(CmsCategory other)
    {
        return this.CategoryId.CompareTo(other.CategoryId);
    }
}

然后您就可以执行就地排序:

List<CmsCategory> list = new List<CmsCategory> { new CmsCategory(), new CmsCategory() };
list.Sort();

答案 7 :(得分:0)

您必须提供比较功能

CmsCategory.compareTo(CmsCategory)

能够为您的CmsCategory元素提供总排序。

答案 8 :(得分:0)

只需执行编译器建议的操作:如果要使用Sort方法进行排序,请将该接口实现到CsmCategory类中。