1

有一堂课

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

4

2 回答 2

2

问题在于您的比较功能。您应该说明一些顺序,例如 false < true 或 true < false。在您的函数中,有时 true < false 有时 false < true。

于 2013-03-17T16:04:48.760 回答
1
public int Compare(Camera x, Camera y)
{   
     return (asc && x.live) ? 1 : 0;
}

您的代码的问题是您无法确定列表元素相互比较的顺序。因此,您正在比较两个凸轮,如果它们的live成员相同,您认为第一个比第二个“更大”。所以,如果你的第一个凸轮是“死的”,第二个是“活的”,第一个更大。那绝对不是你想要的。

使用此代码,如果左侧凸轮处于活动状态 - 它被认为大于右侧,无论右侧的活动值如何。由于我们不关心按其他功能排序,我们真的不关心实时摄像头的“内部”顺序(即所有实时摄像头都被认为是平等的,以及所有死摄像头也被认为是平等的)

于 2013-03-17T16:03:25.113 回答