使用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成员之外,我还有其他成员intstring类型。对于这些类型,我有类似的实现IComparer的排序类。他们没有问题。此live成员的唯一问题。它根本不分类。我希望它要么在列表的顶部,要么在列表底部,但它会在在中间的某个地方。我错过了什么?

使用bool对自定义列表进行排序

问题出在Compare函数上。你应该声明一些排序,比如false<true或true<false。在函数中,有时true<false,有时是false<是的。

public int Compare(Camera x, Camera y)
{   
     return (asc && x.live) ? 1 : 0;
}

代码的问题在于,您不能真正确定列表元素相互比较的顺序。因此,您正在比较两个凸轮,如果它们的live成员等于,则认为第一个凸轮"大于"第二个凸轮。所以,如果你的第一个摄像头是"死的",第二个是"活的",第一个仍然更大。这绝对不是你想要的。

有了这个代码,如果左摄像头是活动的,它被认为比右摄像头大,而不管右摄像头的活动值如何。由于我们不关心按其他功能排序,因此我们真的不关心活动凸轮的"内部"顺序(即所有活动凸轮都被视为相等,所有静态凸轮也被视为相同(