C# 国际比较公司;对ListCollectionView的多个级别进行排序
出于性能原因,我将C# 国际比较公司;对ListCollectionView的多个级别进行排序,c#,wpf,sorting,filter,listcollectionview,C#,Wpf,Sorting,Filter,Listcollectionview,出于性能原因,我将ListCollectionView与CustomSort分拣机一起使用,而不是使用多个SortDescriptions 使用SortDescriptions,可以很容易地按多个级别对数据进行排序,但我一直在使用下面的IComparer 其目的是将所有收藏夹中顶部的所有收藏夹(bool)分组,按计数(int)排序,最后按名称(string)排序 我当前的i比较程序实现: 我的理由是:如果a在Favorite方面不大于b,则检查其计数,最后检查名称 不幸的是,上面的ICompar
ListCollectionView
与CustomSort
分拣机一起使用,而不是使用多个SortDescriptions
使用SortDescriptions
,可以很容易地按多个级别对数据进行排序,但我一直在使用下面的IComparer
其目的是将所有收藏夹中顶部的所有收藏夹(bool
)分组,按计数(int
)排序,最后按名称(string
)排序
我当前的i比较程序
实现:
我的理由是:如果a
在Favorite
方面不大于b
,则检查其计数
,最后检查名称
不幸的是,上面的IComparer
实现没有产生预期的结果-排序到处都是
它应该如下所示:
任何指向正确方向的指针都将不胜感激。您正在考虑三种可能性中的一种
- 如果A.Favorite是真的,B.Favorite是假的,你处理得很好
- 如果A.Favorite==B.Favorite,则返回0而不是查找计数
- 如果A.Favorite为false,B.Favorite为true,则检查计数而不是返回-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;
当您尝试使用as
进行强制转换时,不要忘记检查null
。如果强制转换失败,您仍然可以得到NullReferenceException
,这是一个好的观点!在某些情况下,如果可以确定对象只能是一种特定类型,是否也会发生这种情况?我知道这是我的教诲。谢谢天哪,是的。正是这样-通过比较
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;