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;
}

コードの問題は、リスト要素が互いに比較される順序を実際に確認できないことです。したがって、2 つのカムを比較していて、それらのliveメンバーが等しい場合、最初のカムが 2 番目よりも「大きい」と見なします。したがって、最初のカムが「デッド」で 2 番目のカムが「ライブ」の場合、最初のカムの方がまだ大きくなります。それは間違いなくあなたが望むものではありません。

このコードでは、左のカムがライブの場合、右のライブ値に関係なく、右よりも大きいと見なされます。他の機能による並べ替えは考慮していないため、ライブ カメラの「内部」順序は気にしません (つまり、すべてのライブ カメラは同等と見なされ、すべてのデッドカムも同等と見なされます)。

于 2013-03-17T16:03:25.113 に答える