2012-04-13 70 views
1

我需要一些代碼進行排序,而是在一個陌生的方式排序的客戶訂單

我需要在一個非正常的順序排序,我需要在40年代第一個排序,那麼50年代,90年代,70年代, 80s,60s,20s,30s,10s,00s。

這是什麼最好的方法呢?

這是一個在C#.NET 3.5

+0

什麼是排序背後的規則? – digEmAll 2012-04-13 16:29:55

+0

它們是表示產品類型的代碼,這是他們希望在此報告中分類的順序。 – CaffGeek 2012-04-13 16:31:38

回答

3

您通常可以提供一個自定義的方法來進行排序(無論是一種方法或保存這些值的有序集合類。

或者,你問這個方法裏面的算法應該是什麼?

對於算法,您可以使用以下方法:

int getFirstOrder(int v) { 
    if (50 <= v && v <= 59) { 
    return 1; 
    } else if (90 <= v && v <= 99) { 
    return 2; 
    } 
    // and so on 
} 

int Compare (int v1, int v2) 
{ 
    int o1 = getFirstOrder(v1); 
    int o2 = getFirstOrder(v2); 

    if (o1 < o2 || (o1 == o2 && v1 < v2)) { 
    return -1; 
    } else if (o1 > o2 || (o1 == o2 && v1 > v2)) { 
    return 1; 
    } else { 
    return 0; 
    } 
} 

我敢肯定有一個更有效的方法(尤其是getFirstOrder(),但這應該把你在正確的方向

+0

該算法,我正在尋找一種簡單的方法來排序在這個奇怪的順序。 – CaffGeek 2012-04-13 16:24:37

+0

更新中的代碼是否有幫助? – Attila 2012-04-13 16:32:44

+0

它確實,是的...我會告訴你我想出了什麼 – CaffGeek 2012-04-13 16:35:35

3

大多數排序方法可以採取IComparer對象,所以如果你能寫,它有兩個項目,也可以說,這是第一位的方法,你可以排序使用比較器的方法。

0

我結束了使用此

private class CodeComparer : IComparer<Code> 
{ 
    public int Compare(Code x, Code y) 
    { 
     var order = "4597862310"; 

     var bodyStyleX = x.Substring(6, 2); 
     var bodyStyleY = y.Substring(6, 2); 

     // Same body style group 
     if (bodyStyleX[0].Equals(bodyStyleY[0])) 
      return string.Compare(bodyStyleX, bodyStyleY, true); 

     var indexX = order.IndexOf(bodyStyleX[0]); 
     var indexY = order.IndexOf(bodyStyleY[0]); 

     return indexX < indexY ? -1 : 1; 
    } 
}