2013-03-01 43 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));