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;