我有下一个班级和这个班级的集合。如何通过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>();
答案 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());