0

我有一个ListView,我正在尝试对它们进行排序,BackColor首先是带有红色的项目,然后是带有ForeColor红色的项目,最后是其余的项目,但所有这些都应该在他们的组中按名称排序。

我写了这段代码,但我仍然把大块相同的项目分开:

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

如果您首先确定项目所在的“组”,则可以使这更简单,更易于阅读:

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。

这些是我可以立即看到的两个,但要正确解决这个问题,您需要确保每对可能的输入(两个输入中的每一个的红色前、红色和非红色)都会导致发生正确的比较。

于 2012-07-12T17:47:18.487 回答
1

你似乎错过了一些案例。我会确保所有9个案件都得到处理。(有些可能是多余的)

于 2012-07-12T17:47:27.723 回答
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 回答
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 回答