我有一个通用收集器List
和一些代码以无序方式向收集器添加CmsCategory
。 CmsCategory
包含字段int CategoryId
和string Title
。
List<CmsCategory> categories = new List<CmsCategory>();
categories.Sort();
插入完成后,我需要将收集器中的所有对象按CategoryId (ascending)
排序。
我收到此错误:
至少有一个对象必须实现IComparable。
我的问题:
我在这里使用List<T
&gt;做错了什么?
您是否了解更适合此类操作的Generic Collector?
感谢您抽出宝贵时间。
答案 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 );
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类中。