2013-03-01 45 views
2

我需要在一個對象,它是一個列表中的一個實例排序的屬性,像這樣:如何排序列表既不遞增或遞減,但自

public List<CustomClass> lCustomClasses = new List<CustomClass>(); 

CustomClass有一個屬性MyField的可以有下列值之一:

1,2,3 

我需要排序列表中沒有ASC或DESC而是爲了通過3,1,2

任何快捷方式這樣做沒有複製到另一個目錄?

+0

您可能正在編寫自己的比較器。 http://msdn.microsoft.com/en-us/library/system.collections.icomparer.aspx – Tim 2013-03-01 01:39:02

回答

1

奇怪的要求。 :)
反正,假設你只支持1,2和3,正如其他人建議你可以自己寫IComparer<T>。例如

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<CustomClass> list = new List<CustomClass>() 
     { 
      new CustomClass(){MyField = 3}, 
      new CustomClass(){MyField = 2}, 
      new CustomClass(){MyField = 1}, 
     }; 
     PrintList(list); 
     list.Sort(new CustomClassComparer()); 
     PrintList(list); 
     Console.ReadLine(); 
    } 
    private static void PrintList(List<CustomClass> list) 
    { 
     foreach (var item in list) 
     { 
      if (item != null) 
       Console.WriteLine("MyField: {0}", item.MyField); 
      else 
       Console.WriteLine("MyField: null"); 
     } 
    } 
} 

public class CustomClass 
{ 
    public int MyField { get; set; } 
} 
public class CustomClassComparer : IComparer<CustomClass> 
{ 
    public int Compare(CustomClass x, CustomClass y) 
    { 
     if (x == null) 
     { 
      if (y == null) 
       return 0; 
      return -1; 
     } 
     if (y == null) 
      return 1; 

     if (x.MyField == y.MyField) 
      return 0; 

     if (x.MyField == 2) 
      return 1; 
     if (x.MyField == 1) 
      if (y.MyField == 3) 
       return 1; 
      else 
       return -1; 

     return -1; 
    } 
} 

或者,你可以讓你的CustomClassIComparable<T>

2

使用帶有自定義比較器的List.Sort的overload。請參閱this上的代碼示例MSDN頁面:

0

AFAIK List.Sort就地運行。如果您使用自定義的比較操作,就像在this answer建議,你也許可以達到你想要的東西:

lCustomClasses.Sort((x, y) => my_compare(x.MyField, y.MyField));