2012-02-20 33 views
1

我有一個List<Unit>其中Unit包含NameValue。在此對象中,我存儲有關服裝尺寸Name包含尺寸名稱(S,M,L,XL ..)的信息,並且Value包含該尺寸的數量。通過引用排序一個清單C#

該單元列表是從數據庫中包含的,但列表來按隨機順序,所以在清單當然它可能是這樣的:

Unit(M,3) 
Unit(S,1) 
Unit(XXL,2) 
Unit(L,2) 

我想對列表進行排序,使之成爲更像這樣:

Unit(S,1) 
Unit(M,3) 
Unit(L,2) 
Unit(XXLL,2) 

我的字符串ASCEDESC不能爲了因爲它M談到S等之前。 然後我想我可能會創建一個具有正確順序(XXS,XS,S,M,L,XL,XXL,XXXL)的引用數組,但是如何根據引用對我的列表進行排序。

還有其他巧妙的方法嗎?

更新

感謝所有好的答案,我降落在Enum解決方案,它終於看起來像這樣:

public class Unit 
{ 
    public Unit() 
    { 
    } 

    public Unit(string name, int value) 
    { 
     Value = value; 
     SizeCode = AssignSizeCode(name); 
    } 

    public SizeCode SizeCode { get; set; } 
    public int Value { get; set; } 

    private SizeCode AssignSizeCode(string name) 
    { 
     switch (name) 
     { 
      case "XXS": 
       return SizeCode.XXS; 
      case "XS": 
       return SizeCode.XS; 
      case "S": 
       return SizeCode.S; 
      case "M": 
       return SizeCode.M; 
      case "L": 
       return SizeCode.L; 
      case "XL": 
       return SizeCode.XL; 
      case "XXL": 
       return SizeCode.XXL; 
      case "XXXL": 
       return SizeCode.XXXL; 
      default: 
       return SizeCode.Unknown; 
     } 
    } 

} 

public enum SizeCode 
{ 
    XXS = 1, 
    XS = 2, 
    S = 3, 
    M = 4, 
    L = 5, 
    XL = 6, 
    XXL = 7, 
    XXXL = 8, 
    Unknown = 9 
} 

,我喜歡這種吧:

units = units.OrderBy(x => (int)x.SizeCode).ToList(); 

任何意見,或我可以改進的東西?

+0

通常服裝尺寸或者是一個枚舉或包括相關的尺寸其他數據存儲的範圍內產生的,即:胸部的大小等等。這將有一個數值,可以排序或簡單的枚舉... public enum ApparelSize {XXS = 0,XS = 1,S = 2} – Lloyd 2012-02-20 09:30:37

回答

3

如何使用枚舉

public enum Size 
    { 
     Small = 1, 
     Medium = 2, 
     // etc 

    } 

然後你就可以轉換成單元類枚舉值int和排序的整數值。

+2

這是一個很好的答案 - 'S'和'XXL'等都只是文本大小的表示,任何排序都不應該直接在這個文本上完成(它應該在枚舉或int上,用於內部表示大小)。 – slugster 2012-02-20 09:39:43

+0

感謝您將我指向'Enum'解決方案,我用我的最終代碼更新了我的問題。請檢查它。 – Martin 2012-02-20 10:10:01

2

好吧,我認爲你應該在你的數據庫中有OrderIndex列並按該列排序。

骯髒的方式是有自己的類與接口:IComparer或做同樣的委託排序。在MSDN

檢查ICompararer:http://msdn.microsoft.com/en-us/library/system.collections.icomparer.aspx

+0

我想OrderIndex是一個好主意,但我必須澄清,結果是不直接來自SQL數據庫,而是直接來自ERP系統。所以我不能真正將該列添加到ERP系統。 – Martin 2012-02-20 09:26:36

+0

+1'IComparer',我會做同樣的事情。 – 2012-02-20 09:35:58

+1

你的答案應該是相反的 - IComparer是一個很好的解決方案,數據庫上的排序列是一個小問題。爲了獲得一個可以贏得選票的好回答,你應該給出一個IComparer的例子或者鏈接到一些關於它的doco。 – slugster 2012-02-20 09:36:07

0

你可以在你的Unit類添加int類型的Size財產。然後使用此Size屬性對您的列表進行排序。

public class Unit1 
{ 
    public Unit1(string name) 
    { 
     this.Name = name; 

     switch (this.Name) 
     { 
      case "XXS": 
       this.Size = 1; 
       break; 
      case "XS": 
       this.Size = 2; 
       break; 
      case "S": 
       this.Size = 3; 
       break; 
      case "M": 
       this.Size = 4; 
       break; 
      case "L": 
       this.Size = 5; 
       break; 
     } 
    } 

    public string Name { get; set; } 

    public int Size { get; private set; } 

    public int Value { get; set; } 
} 

private static void Main(string[] args) 
{ 
    List<Unit1> list1 = new List<Unit1>(); 
    list1.Add(new Unit1("XS") { Value = 1 }); 
    list1.Add(new Unit1("M") { Value = 1 }); 
    list1.Add(new Unit1("S") { Value = 1 }); 
    list1.Add(new Unit1("L") { Value = 1 }); 

    var sortedList = list1.OrderBy(z => z.Size).ToList(); 
} 
0

您只需使用比較代表。首先,做一個函數,只是爲每個大小分配一個數字,然後用它來比較:

(我不確定您的大小是否作爲一個字符串存儲爲枚舉;但我建議將它們存儲爲枚舉序號按大小順序遞增或遞減,這將有助於使您的比較委託更快更簡單)。

public class ShirtSizeCompare { 
    private static int getIndex(Unit x) { 
     if(x == Null) { return -1; } 

     if(x.size == "S") { 
      return 0; 
     } else if(x.size == "M") { 
      return 1; 
     } 

     ///... 
    }    

    private static int CompareShirts(Unit x, Unit y) { 
     int _x = getIndex(x); 
     int _y = getIndex(y); 

     if(_x < _y) { 
      return -1; 
     } else if(_x == _y) { 
      return 0; 
     } else { 
      return 1; 
     } 
    } 
} 

然後,只需使用Comparison委託對列表進行排序:

List<Unit> unitList; 
unitList.sort(CompareShirts); 

比較代表基本的輸入是兩個變量xy和回報:

<0 (if x < y) 
>0 (if x > y) 
0 (if x == y) 

檢查這page for more information:http://msdn.microsoft.com/en-us/library/w56d4y5z.aspx

1

你可以做什麼MSDN建議here

// First, declare a few classes that implement the IComparer interface. 
public class CompareShirtSize : IComparer<string> 
{ 
    // Because the class implements IComparer, it must define a 
    // Compare method. The method returns a signed integer that indicates 
    // whether s1 > s2 (return is greater than 0), s1 < s2 (return is negative), 
    // or s1 equals s2 (return value is 0). This Compare method compares strings. 
    public int Compare(string size1, string size2) 
    { 
     // Do size comarison here 
     return ConvertSizeToInt(size1) - ConvertSizeToInt(size2); 
    } 

    private int ConvertSizeToInt(string size) 
    { 
     switch (size) 
     { 
     case "XXS": 
      return 1; 
     case "XS": 
      return 2; 
     case "S": 
      return 3; 
     case "M": 
      return 4; 
     case "L": 
      return 5; 
     default: 
      // some error handling 
     } 
} 


// The following method tests the Compare methods defined in the previous classes. 
public static void OrderByIComparer() 
{ 
    List<Unit> units; 

    // Sort the elements of the array alphabetically. 
    var sortedList = units.OrderBy(unit => unit.Size, new CompareShirtSize()); 
}