Сортировка списка <T>коллекция по результату метода. - PullRequest
0 голосов
/ 05 февраля 2012

У меня есть следующий класс и коллекция этих классов. Как я могу отсортировать эту коллекцию по Perimeter () по asc?

    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 ]

7 голосов
/ 05 февраля 2012

lst = lst.OrderBy(x => x.Perimeter()).ToList() следует хитрости. Существует также метод OrderByDesc.

Конечно, вы также можете использовать синтаксис запросов LINQ в качестве предложений Rob4md, однако имейте в виду, что все запросы LINQ возвращают IEnumerable и выполняются лениво.
Вы должны использовать энергичную операцию, такую ​​как ToList() или ToArray(), чтобы выполнить их, как только это будет иметь смысл, поскольку в итоге вы можете выполнить перечисление несколько раз.

Вы можете взглянуть на страницу 101 LINQ Samples в MSDN . Существует много примеров использования LINQ, также рассматривается OrderBy .

2 голосов
/ 05 февраля 2012

Вы можете использовать оператор 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());
0 голосов
/ 05 февраля 2012

В списке есть метод 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...