2012-02-20 14 views
1

私はList<Unit>です。はNameValueです。このオブジェクトでは、私はアパレルのサイズに関する情報を保存していますNameはサイズの名前(S、M、L、XL ..)を含み、Valueはそのサイズの数量を含んでいます。リストを参照するには、C#

LISTEで、それはこのようなことかもしれませんので、このユニットのリストは、データベースから含まれているが、リストはランダムな順序で来ている:

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

私はそれがよりになるようにリストをソートしたいと思いますこのように:

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

私はそれ以来MはそうでSの前に来ると、文字列ASCEまたはDESC上の順序を傾けます。 次に、正しい順序(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

答えて

3

どのように、あなたはint型と整数値でソートするユニットクラスの列挙値に変換することができます

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

    } 

を列挙型を使用してについて。

+2

これは良い答えです - 'S'と' XXL'などは単純にサイズのテキスト表現であり、このテキストには直接ソートするべきではありません(サイズを表すために内部的に使用されるenumまたはintにあるべきです) )。 – slugster

+0

「Enum」ソリューションを私に指摘してくれてありがとう、最終的なコードで質問を更新しました。それを確認してください。 – Martin

2

私はデータベースにOrderIndex列を持ち、その列で並べ替えるべきだと考えています。

汚れた方法は、インターフェイスIComparerで独自のクラスを持つか、並べ替えの委任と同じことです。 MSDNで

チェックICompararer:http://msdn.microsoft.com/en-us/library/system.collections.icomparer.aspx

+0

OrderIndexは良いアイデアだと思いますが、結果はSQLデータベースからは直接ではなく、ERPシステムから直接アクセスします。だから私は本当にその列をERPシステムに追加することはできません。 – Martin

+0

+1はIComparerに対して同じことをします。 –

+1

あなたの答えは、他の方法で丸くなければなりません - IComparerは良い解決策であり、データベースの列を並べることはやや難解です。票を集める良い答えを作るには、IComparerの例を挙げるか、それに関するいくつかのドコにリンクする必要があります。 – slugster

0

あなたのクラスUnitタイプintSizeプロパティを追加することができます。次に、この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

単に比較委任を使用する必要があります。まず、すべてのサイズに数値を代入して比較する関数を作成してください:

(あなたのサイズが列挙型としてStringとして格納されているかどうかはわかりませんが、列挙型として格納することをお勧めします序数をサイズの順に増減してください。これは、比較委譲の迅速化と簡略化に役立ちます。

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) 

はこれをチェック詳細については、ページをご覧ください。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()); 
} 
関連する問題