在C#中排列对象列表

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

这是一个列表,我试图找出一个有效的方式来sorting列表CarList,包含6(或任何整数量)汽车,汽车制造date。 我打算做泡沫sorting,但将工作? 任何帮助?

谢谢

由于List<T>类包含一个Sort方法 ,因此这对你来说是微不足道的。 (它使用QuickSortalgorithm,而不是Bubble Sort,反正通常更好。)更好的是,它有一个重载的参数,这意味着您可以传递一个lambdaexpression式,并且确实非常简单。

尝试这个:

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

你可以使用LINQ:

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

编辑:有了这种方法,它可以很容易地添加更多的sorting列:

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

最好的方法是实现IComparableIComparable<T> ,然后调用List<T>.Sort() 。 这将为您做好所有的分类工作。

另一个select是使用自定义比较器:

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

注:我没有编译这个代码,所以你可能不得不删除错字

编辑:修改它,使比较器按照问题请求比较在creationdate。

我只是在List.Sort方法中使用构build。 它使用平均在O(n log n)中运行的QuickSortalgorithm。

此代码应该为你工作,我改变你的属性为自动属性,并定义一个静态的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); } } 

希望这可以帮助。

把这里提到的一些片段放在一起。 这编译和工作在C#4.x和VS2010。 我用一个WinFormtesting。 所以将该方法添加到WinForm Main() 。 您至less需要System.LinqSystem.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; } } 

如果你使用高效的sorting方式,我build议不要使用冒泡sorting,而应该快速sorting。 这个页面提供了一个相当好的algorithm解释:

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

祝你好运!

我会避免写我自己的sortingalgorithm,但如果你要去,看看http://www.sorting-algorithms.com/一些比较不同的sortingalgorithm

如果使用2.0,以下讨论可能会有用: C#List <>按x和ysorting