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

回答

2

问题与您的比较功能。您应该声明一些命令,如假<为真或<为假。在你的函数中,有时候是真的<错误,有时候错误的<是真的。

+0

真的:)它解决了,谢谢。 – Pablo 2013-03-17 16:10:40

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

你的代码的问题是你不能确定列表元素相互比较的顺序。所以,你在比较两个凸轮,如果他们的live成员是等于你首先考虑的是不是第二个“更大”。所以,如果你的第一凸轮已经是“死”和第二个是“活”的,第一仍然较大。这绝对不是你想要的。

有了这个代码,如果左凸轮是活的 - 它被认为是比对时,无论正确的生活价值。由于我们不关心其他功能分类,我们真的不在乎的活凸轮“内部”命令(即所有活凸轮被视为相等,以及认为是平等的太所有deadcams)

+0

相同的结果。对不起 – Pablo 2013-03-17 16:04:56