Подтвердить что ты не робот

Сортировка списка объектов в С#

public class CarSpecs
{
  public String CarName { get; set; }

  public String CarMaker { get; set; }

  public DateTime CreationDate { get; set; }
}

Это список, и я пытаюсь найти эффективный способ сортировки этого списка списка CarList, содержащего 6 (или любую целую сумму) автомобилей, по дате изготовления автомобиля. Я собирался сделать Bubble, но будет ли это работать? Любая помощь?

Спасибо

4b9b3361

Ответ 1

Класс List<T> делает это тривиальным для вас, поскольку он содержит метод Sort. (Он использует алгоритм QuickSort, а не Bubble Sort, который, как правило, лучше в любом случае.) Еще лучше, он имеет перегрузку, которая принимает аргумент Comparison<T>, что означает, что вы можете передать лямбда-выражение и сделать вещи очень простыми.

Попробуйте следующее:

CarList.Sort((x, y) => DateTime.Compare(x.CreationDate, y.CreationDate));

Ответ 2

Вы можете использовать LINQ:

listOfCars.OrderBy(x => x.CreationDate);

EDIT: при таком подходе его легко добавить в более сортированные столбцы:

listOfCars.OrderBy(x => x.CreationDate).ThenBy(x => x.Make).ThenBy(x => x.Whatever);

Ответ 3

Лучшим подходом является реализация IComparable или IComparable<T>, а затем вызовите List<T>.Sort(). Это сделает всю сложную работу по сортировке для вас.

Ответ 4

Другой вариант - использовать пользовательский сопоставитель:

using System;
using System.Collections.Generic;
using System.Text;

namespace Yournamespace
{
   class CarNameComparer : IComparer<Car>
   {
      #region IComparer<Car> Members

      public int Compare(Car car1, Car car2)
      {
         int returnValue = 1;
         if (car1 != null && car2 == null)
         {
            returnValue = 0;
         }
         else if (car1 == null && car2 != null)
         {
            returnValue = 0;
         }
         else if (car1 != null && car2 != null)
         {
            if (car1.CreationDate.Equals(car2.CreationDate))
            {
               returnValue = car1.Name.CompareTo(car2.Name);
            }
            else
            {
               returnValue = car2.CreationDate.CompareTo(car1.CreationDate);
            }
         }
         return returnValue;
      }

      #endregion
   }
}

который вы вызываете так:

yourCarlist.Sort(new CarNameComparer());

Примечание. Я не компилировал этот код, поэтому вам может потребоваться удалить

Изменить: изменил его, чтобы сравнитель сравнивал значение createdate с запросом, о котором идет речь.

Ответ 5

Я бы просто использовал сборку в методе List.Sort. Он использует алгоритм QuickSort, который в среднем работает в O (n log n).

Этот код должен работать для вас, я изменяю ваши свойства на автоматические свойства и определяю статический метод CompareCarSpecs, который использует уже существующий метод DateTime.CompareTo.

class Program
{
    static void Main(string[] args)
    {
        List<CarSpecs> cars = new List<CarSpecs>();
        cars.Sort(CarSpecs.CompareCarSpecs);
    }
}

public class CarSpecs
{
    public string CarName { get; set; }
    public string CarMaker { get; set; }
    public DateTime CreationDate { get; set; }

    public static int CompareCarSpecs(CarSpecs x, CarSpecs y)
    {
        return x.CreationDate.CompareTo(y.CreationDate);
    }
}

Надеюсь, что это поможет.

Ответ 6

Поместите некоторые части, упомянутые здесь вместе. Это компилируется и работает в С# 4.x и VS2010. Я тестировал с помощью WinForm. Поэтому добавьте метод в WinForm Main(). Вам понадобятся сборки System.Linq и System.Generic.Collection.

    private void SortCars()
    {
        List<CarSpecs> cars = new List<CarSpecs>();
        List<CarSpecs> carsSorted = new List<CarSpecs>();

        cars.Add(new CarSpecs
        {
            CarName = "Y50",
            CarMaker = "Ford",
            CreationDate = new DateTime(2011, 4, 1),
        });

        cars.Add(new CarSpecs
        {
            CarName = "X25",
            CarMaker = "Volvo",
            CreationDate = new DateTime(2012, 3, 1),
        });

        cars.Add(new CarSpecs
        {
            CarName = "Z75",
            CarMaker = "Datsun",
            CreationDate = new DateTime(2010, 5, 1),
        });

        //More Comprehensive if needed  
        //cars.OrderBy(x => x.CreationDate).ThenBy(x => x.CarMaker).ThenBy(x => x.CarName);

        carsSorted.AddRange(cars.OrderBy(x => x.CreationDate));

        foreach (CarSpecs caritm in carsSorted)
        {
            MessageBox.Show("Name: " +caritm.CarName 
                + "\r\nMaker: " +caritm.CarMaker
                + "\r\nCreationDate: " +caritm.CreationDate);
        }
    }
}

public class CarSpecs
{
    public string CarName { get; set; }
    public string CarMaker { get; set; }
    public DateTime CreationDate { get; set; }
} 

Ответ 7

Если вы после эффективного способа сортировки, я бы посоветовал не использовать сортировку пузырьков и вместо этого перейти на быстрый вид. Эта страница дает довольно хорошее объяснение алгоритма:

http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=574

Удачи!

Ответ 8

Я бы не стал писать собственный алгоритм сортировки, но если вы все равно собираетесь взглянуть на http://www.sorting-algorithms.com/ для некоторых сравнений различных алгоритмов сортировки...