2012-02-05 23 views
0

我有下一个课程和这个课程的集合。我怎样才能通过asc排序Perimeter()?按方法结果收集排序列表<T>。

public class Circle 
    { 
     private double _r; 

     public Double Radius 
     { 
      get { return _r; } 
      set { _r = value; } 
     } 

     public double Perimeter() 
     { 
      return 2*Math.PI*Radius; 
     } 
    } 
... 
var lst = new List<Circle>(); 

回答

7

lst = lst.OrderBy(x => x.Perimeter()).ToList()应该去诀窍。还有一个可用的OrderByDesc方法。

当然,您也可以使用LINQ查询语法作为Rob4md提示,但是请记住,所有LINQ查询都会返回IEnumerable并且会被懒惰地执行。
您应该使用像ToList()ToArray()这样的热切操作,只要它有意义就执行它们,因为您最终可能会多次执行枚举。

您可以查看101 LINQ Samples page at the MSDN。有关如何使用LINQ的许多示例,也涵盖了OrderBy

2

您可以使用linq语句来执行此操作。使用您的圈子类尝试此控制台程序:

 var circles = new List<Circle>(); 
     for (int i = 10; i > 0; i--) 
     { 
      Circle c = new Circle(); 
      c.Radius = i; 
      circles.Add(c); 
     } 

     var orderList = from c in circles 
         orderby c.Perimeter() ascending 
         select c; 

     foreach (var circle in orderList) 
      Console.WriteLine(circle.Perimeter()); 
+1

,你甚至可以使用LINQ生成您的列表:'VAR cirlces = Enumerable.Range(0,10 ).Select(x => new Circle {Radius = 10-x});' – Zebi 2012-02-05 13:39:30

0

列表有一个Sort方法,它将一个比较器对象作为输入。

首先,定义比较器:

public class PerimeterComparer: IComparer<Circle> 
{ 
    public int Compare(Circle x, Circle y) 
    { 
    if(x.Perimeter() > y.Perimeter()) { return -1; } 
    if(x.Perimeter() < y.Perimeter()) { return 1; } 
    return 0; 
    } 
} 

然后调用排序方法:

lst.Sort(new PerimeterComparer());