IComparer 和排序 ListCollectionView 的多个级别
IComparer & Sorting Multiple Levels of ListCollectionView
出于性能原因,我使用 ListCollectionView
和 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
在 Favorite
方面不大于 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;
出于性能原因,我使用 ListCollectionView
和 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
在 Favorite
方面不大于 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;