2012-07-12 69 views
0

我有一個ListView,我試圖對它們進行排序,其中用紅色的BackColor項目將是第一個,然後排序與紅色的ForeColor,最後項目的休息,但所有的項目他們應該在他們的組內按名稱排序。的IComparer通過不同的指標分析

我寫了這個代碼,但我仍然得到同樣的物品的大塊分離遍:

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

回答

1

的問題是,你錯過了幾個案例:

  • 如果a是非紅色,你最終每次都返回1,而你真的想檢查b是否有紅色的前景或背景。如果確實如此,則需要返回1.如果不是,則需要比較文本。
  • 如果a有一個紅色的前景,但b沒有,你總是返回-1,而你首先需要檢查是否b有紅色背景。如果是這樣,你需要返回1.

這些是我可以立即看到的兩個,但要正確地解決這個問題,您需要確保每一對可能的輸入(紅前,後紅,而對於兩個輸入的每一個都不是紅色)將導致正確的比較發生。

+0

謝謝是的,似乎很難列出所有的可能性。希望有另一種方法可以自己指定項目的排序優先級,而不是成對排序。 – 2012-07-12 17:48:40

1

您似乎錯過了一些情況。我會確保處理所有9個案例。 (有些人可能是多餘的)

+0

他的確在那裏有回報價值。如果'a.BackColor'是紅色,但是'b.BackColor'不是,那麼方法返回-1,這是正確的('a'必須在'b'之前,不管文本或前景色如何。) – dlev 2012-07-12 17:51:24

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); 
       } 
      } 
     } 
    } 
} 
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; 
} 
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; 
    } 
} 
+0

這是一個很酷的方式來解決它。 – 2012-07-12 18:22:32