IComparer&对ListCollectionView

时间:2017-05-20 17:37:37

标签: c# wpf sorting filter listcollectionview

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

使用SortDescriptions,可以很容易地按多个级别对数据进行排序,但我仍然坚持使用下面的IComparer执行相同操作。

目的是将所有Favoritebool)放在所有收藏夹的顶部,按Countint)排序,最后按{{ 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

任何指向正确方向的人都会非常感激。

1 个答案:

答案 0 :(得分:0)

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

  • 如果A.Favorite是真的而且B.Favorite是假的,那么你处理得很好
  • 如果A.Favorite == B.Favorite,则返回0而不是查找Count
  • 如果A.Favorite为假且B.Favorite为真,则您需要检查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;