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

时间:2013-03-17 16:00:46

标签: c# sorting icomparer

有一个班级

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成员唯一的问题。它根本不排序。我希望它可以在列表顶部或底部,但它会在中间位置。我错过了什么?

2 个答案:

答案 0 :(得分:2)

问题出在您的比较功能上。你应该陈述一些排序,比如false&lt;真实或真实&lt;假。在你的功能中,有时候是真的&lt;错误,有时是假的&lt;真。

答案 1 :(得分:1)

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

您的代码存在的问题是您无法确定列表元素相互比较的顺序。因此,您正在比较两个凸轮,如果他们的live成员相等,您认为第一个是“更大”而不是第二个。所以,如果你的第一个摄像头已经“死”,第二个摄像头是“现场”,那么第一个仍然更大。这绝对不是你想要的。

使用此代码,如果左侧凸轮处于活动状态 - 无论右侧的实时值如何,它都被视为大于右侧。由于我们不关心按其他功能进行排序,我们实际上并不关心实时凸轮的“内部”顺序(即所有现场凸轮都被认为是相同的,以及所有死锁也被视为相同)