0

私は を持っていて、最初に が赤のアイテム、次にが赤のアイテム、最後に残りのアイテムになるListViewように並べ替えようとしていますが、それらはすべてグループ内の名前で並べ替える必要があります。BackColorForeColor

私はこのコードを書きましたが、同じアイテムのチャンクが全体的に分離されています:

public int Compare (object x, object y)
{
    int CompareResult;
    ListViewItem a = (ListViewItem) x;
    ListViewItem b = (ListViewItem) y;

    if (a.BackColor == Color.FromArgb (200, 0, 0))
    {
        if (b.BackColor == Color.FromArgb(200, 0, 0))
        {
            return a.Text.CompareTo(b.Text);
        }
        else
        {
            return -1;
        }
    }
    else
    {
        if (a.ForeColor == Color.FromArgb(200, 0, 0))
        {
            if (b.ForeColor == Color.FromArgb(200, 0, 0))
            {
                return a.Text.CompareTo(b.Text);
            }
            else
            {
                return -1;
            }
        }
        else
        {
            return 1;
        }
    }
}
4

5 に答える 5

1

少しリファクタリング:

実行されていませんが、正しいようです -

public int Compare(object x, object y)
        {
            ListViewItem a = (ListViewItem)x;
            ListViewItem b = (ListViewItem)y;

            Color red = Color.FromArgb(200, 0, 0);

            int textCompare = a.Text.CompareTo(b.Text);
            bool bothRed = a.BackColor == red && b.BackColor == red;
            bool bothOtherColor = a.BackColor != red && b.BackColor != red;

            return bothRed || bothOtherColor ? textCompare : b.BackColor == red ? 1 : -1;
}
于 2012-07-12T18:07:50.683 に答える
1

アイテムがどの「グループ」に属しているかを最初に判断すると、これをはるかに単純化して読みやすくすることができます。

class Comparer : IComparer<ListViewItem> 
{       
    public int Compare (ListViewItem left, ListViewItem right)
    {
        var leftGroup = DetermineGroup(left);
        var rightGroup = DetermineGroup(right);

        if(leftGroup == rightGroup) 
        { 
           return left.Text.CompareTo(right.Text);
        }

        return leftGroup.CompareTo(rightGroup);
    }

    enum Grouping 
    {
        RedBack,
        RedFront,
        Neither
    }

    Grouping DetermineGroup(ListViewItem x) 
    {
        if(x.BackColor == Color.Red) return Grouping.RedBack;
        if(x.ForeColor == Color.Red) return Grouping.RedFront;

        return Grouping.Neither;
    }
}
于 2012-07-12T18:09:32.540 に答える
1

問題は、いくつかのケースが欠落していることです。

  • が赤でない場合a、毎回 1 を返すことになりますが、実際にはb前景または背景が赤かどうかを確認する必要があります。一致する場合は 1 を返す必要があります。一致しない場合は、テキストを比較する必要があります。
  • a赤い前景があるがbそうでない場合は、常に -1 を返しますが、最初bに赤い背景があるかどうかを確認する必要があります。その場合は、1 を返す必要があります。

これらは私がすぐに確認できる 2 つですが、これを適切に修正するには、考えられるすべての入力のペア (2 つの入力のそれぞれについて赤前、赤後、および非赤) が確実に発生するようにする必要があります。正しい比較が行われます。

于 2012-07-12T17:47:18.487 に答える
1

あなたはいくつかのケースを見逃しているようです。9つのケースすべてが処理されるようにします。(一部は冗長かもしれません)

于 2012-07-12T17:47:27.723 に答える
0

これはうまくいきます:

public int Compare ( object x, object y )
{
    int CompareResult;
    ListViewItem a = ( ListViewItem ) x;
    ListViewItem b = ( ListViewItem ) y;

    Color red = Color.FromArgb(200, 0, 0);

    if (a.BackColor == red)
    {
        if (b.BackColor == red)
        {
            return a.Text.CompareTo(b.Text);
        }
        else
        {
            return -1;
        }
    }
    else
    {
        if (b.BackColor == red)
        {
            return 1;
        }
        else
        {
            if (a.ForeColor == red)
            {
                if (b.ForeColor == red)
                {
                    return a.Text.CompareTo(b.Text);
                }
                else
                {
                    return -1;
                }
            }
            else
            {
                if (b.ForeColor == red)
                {
                    return 1;
                }
                else
                {
                    return a.Text.CompareTo(b.Text);
                }
            }
        }
    }
}
于 2012-07-12T17:57:54.373 に答える