出于性能原因,我使用ListCollectionView
CustomSort
分拣机而不是多个SortDescriptions
。
使用SortDescriptions
,可以很容易地按多个级别对数据进行排序,但我仍然坚持使用下面的IComparer
执行相同操作。
目的是将所有Favorite
(bool
)放在所有收藏夹的顶部,按Count
(int
)排序,最后按{{ 1}}(Name
)。
string
实施:IComparer
我的理由是:如果public class CustomSorter : IComparer
{
public int Compare(object a, object b)
{
var gA = a as MyObj;
var gB = b as MyObj;
var favourite = gA.Favorite.CompareTo(gB.Favorite);
var count = gA.Count.CompareTo(gB.Count);
var name = gA.Name.CompareTo(gB.Name);
return favourite != -1 ? favourite : count != -1 ? count : name;
}
}
在a
方面不超过b
,请检查其Favorite
,最后检查Count
。
不幸的是,上面的Name
实现并没有产生预期的结果 - 整个过程都进行了排序。
IComparer
任何指向正确方向的人都会非常感激。
答案 0 :(得分:0)
您考虑了3种可能性中的1种。
你想要的是这样的:
public int Compare(object a, object b)
{
var gA = a as MyObj;
var gB = b as MyObj;
//Handle null values, same references...
if(gA.Favorite != gB.Favorite) return gA.Favorite.CompareTo(gB.Favorite);
if(gA.Count != gB.Count) return gA.Count.CompareTo(gB.Count);
return gA.Name.CompareTo(gB.Name);
}
或者像你一样写作:
return favourite != 0 ? favourite : count != 0 ? count : name;