有一个班级
public class Camera
{
...
public bool live;
...
}
这是排序类
public class CameraSortByLive : IComparer<Camera>
{
private bool asc;
public CameraSortByLive(bool a)
{
this.asc = a;
}
public int Compare(Camera x, Camera y)
{
if (x.live != y.live)
return asc ? 0 : 1;
else
return asc ? 1 : 0;
}
}
这就是我使用它的方式:
List<Camera> CameraList = new List<Camera>();
CameraList.Sort(new CameraSortByLive(sortAsc));
现在,我在live
成员旁边,我有其他成员int
,string
类型。对于这些类型,我有类似的排序类实现IComparer
。他们没有问题。这个live
成员唯一的问题。它根本不排序。我希望它可以在列表顶部或底部,但它会在中间位置。我错过了什么?
答案 0 :(得分:2)
问题出在您的比较功能上。你应该陈述一些排序,比如false&lt;真实或真实&lt;假。在你的功能中,有时候是真的&lt;错误,有时是假的&lt;真。
答案 1 :(得分:1)
public int Compare(Camera x, Camera y)
{
return (asc && x.live) ? 1 : 0;
}
您的代码存在的问题是您无法确定列表元素相互比较的顺序。因此,您正在比较两个凸轮,如果他们的live
成员相等,您认为第一个是“更大”而不是第二个。所以,如果你的第一个摄像头已经“死”,第二个摄像头是“现场”,那么第一个仍然更大。这绝对不是你想要的。
使用此代码,如果左侧凸轮处于活动状态 - 无论右侧的实时值如何,它都被视为大于右侧。由于我们不关心按其他功能进行排序,我们实际上并不关心实时凸轮的“内部”顺序(即所有现场凸轮都被认为是相同的,以及所有死锁也被视为相同)