0

出于性能原因,我将 aListCollectionView与一个CustomSort排序器一起使用,而不是多个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;
    }
}

我的理由是:如果a不大于bFavorite那么检查它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

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

4

1 回答 1

0

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

  • 如果 A.Favorite 为真,B.Favorite 为假,你处理好
  • 如果 A.Favorite == B.Favorite,则返回 0 而不是查找 Count
  • 如果 A.Favorite 为 false 而 B.Favorite 为 true,则您正在检查 Count 而不是返回 -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;
于 2017-05-20T20:05:26.760 回答