Сортировка списка объектов в С#
public class CarSpecs
{
public String CarName { get; set; }
public String CarMaker { get; set; }
public DateTime CreationDate { get; set; }
}
Это список, и я пытаюсь найти эффективный способ сортировки этого списка списка CarList, содержащего 6 (или любую целую сумму) автомобилей, по дате изготовления автомобиля. Я собирался сделать Bubble, но будет ли это работать? Любая помощь?
Спасибо
Ответы
Ответ 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/ для некоторых сравнений различных алгоритмов сортировки...
Ответ 9
Если вы используете 2.0, может быть полезно следующее обсуждение: С# List < gt; Сортировка по x, затем y