IComparer 和排序 ListCollectionView 的多个级别

IComparer & Sorting Multiple Levels of ListCollectionView

出于性能原因,我使用 ListCollectionViewCustomSort 分拣机而不是多个 SortDescriptions

使用 SortDescriptions,按多个级别对数据进行排序相当容易,但我仍然对下面的 IComparer 做同样的事情。

目的是将所有 Favorite (bool) 分组在顶部,在所有收藏夹中,按 Count (int) 排序,最后按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;
    }
}

我的理由是:如果 aFavorite 方面不大于 b,则检查其 Count,最后检查 Name

不幸的是,上面的 IComparer 实现没有产生预期的结果 - 排序到处都是。

它应该如下所示:

1. true  100 Z
2. true  50  A
3. true  50  B
4. true  10  A
5. false 100 Z
6. false 50  A
7. false 100 A
8. false 100 B

任何正确方向的指示将不胜感激。

您考虑了 3 种可能性中的 1 种。

  • 如果A.Favorite为真,B.Favorite为假,你处理得好
  • 如果A.Favorite == B.Favorite,你return 0而不是寻找计数
  • 如果 A.Favorite 为假且 B.Favorite 为真,您正在检查计数而不是 returning -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;