在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);
最好的方法是实现IComparable
或IComparable<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。 我用一个WinForm
testing。 所以将该方法添加到WinForm
Main()
。 您至less需要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; } }
如果你使用高效的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