按方法结果对List <t>集合进行排序。</t>

时间:2012-02-05 13:14:35

标签: c# sorting lambda

我有下一个班级和这个班级的集合。如何通过asc?(/ p>)按Perimeter()对此集合进行排序

    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>();

3 个答案:

答案 0 :(得分:7)

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

当然你也可以像Rob4md所说的那样使用LINQ查询语法,但请记住,所有LINQ查询都返回IEnumerable并且是懒惰地执行。
你应该使用像ToList()ToArray()这样的急切操作,一旦有意义就执行它们,因为你可能会多次执行枚举。

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

答案 1 :(得分: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());

答案 2 :(得分:0)

List有一个Sort方法,它将comparer对象作为输入。

首先,定义比较器:

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;
  }
} 

然后调用sort方法:

lst.Sort(new PerimeterComparer());