使用bool对自定义列表进行排序
本文关键字:排序 列表 自定义 bool 使用 | 更新日期: 2023-09-27 18:04:14
有一个类
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
成员的唯一问题。它根本不分类。我希望它要么在列表的顶部,要么在列表底部,但它会在在中间的某个地方。我错过了什么?
问题出在Compare函数上。你应该声明一些排序,比如false<true或true<false。在函数中,有时true<false,有时是false<是的。
public int Compare(Camera x, Camera y)
{
return (asc && x.live) ? 1 : 0;
}
代码的问题在于,您不能真正确定列表元素相互比较的顺序。因此,您正在比较两个凸轮,如果它们的live
成员等于,则认为第一个凸轮"大于"第二个凸轮。所以,如果你的第一个摄像头是"死的",第二个是"活的",第一个仍然更大。这绝对不是你想要的。
有了这个代码,如果左摄像头是活动的,它被认为比右摄像头大,而不管右摄像头的活动值如何。由于我们不关心按其他功能排序,因此我们真的不关心活动凸轮的"内部"顺序(即所有活动凸轮都被视为相等,所有静态凸轮也被视为相同(