public class CarSpecs
{
public String CarName { get; set; }
public String CarMaker { get; set; }
public DateTime CreationDate { get; set; }
}
Dies ist eine Liste, und ich versuche, einen effizienten Weg zu finden, um diese Liste zu sortieren. Liste CarList, die 6 (oder einen beliebigen ganzzahligen Betrag) Autos enthält, nach dem Datum der Fahrzeugherstellung. Ich wollte Bubble sortieren, aber wird das funktionieren? Irgendeine Hilfe?
Vielen Dank
Die List<T>
-Klasse macht dies für Sie einfach, da sie eine Sort
-Methode enthält. (Es wird der QuickSort-Algorithmus verwendet, nicht Bubble Sort, was normalerweise ohnehin besser ist.) Noch besser: Es gibt eine Überladung, die ein Comparison<T>
-Argument benötigt, was bedeutet, dass Sie einen Lambda-Ausdruck übergeben können und die Dinge in der Tat sehr einfach machen.
Versuche dies:
CarList.Sort((x, y) => DateTime.Compare(x.CreationDate, y.CreationDate));
Sie könnten LINQ verwenden:
listOfCars.OrderBy(x => x.CreationDate);
BEARBEITEN: Mit diesem Ansatz können mehrere Sortierspalten einfach hinzugefügt werden:
listOfCars.OrderBy(x => x.CreationDate).ThenBy(x => x.Make).ThenBy(x => x.Whatever);
Am besten implementieren Sie entweder IComparable
oder IComparable<T>
und rufen dann List<T>.Sort()
auf. Dies erledigt die ganze harte Sortierarbeit für Sie.
Eine andere Option wäre, einen benutzerdefinierten Vergleicher zu verwenden:
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
}
}
was du so anrufst:
yourCarlist.Sort(new CarNameComparer());
Hinweis: Ich habe diesen Code nicht kompiliert, daher müssen Sie möglicherweise Typos entfernen
Bearbeiten: Es wurde so geändert, dass der Vergleicher das Erstellungsdatum wie gewünscht vergleicht.
Ich würde nur den Build in List.Sort-Methode verwenden. Es verwendet den QuickSort-Algorithmus, der im Durchschnitt in O (n log n) läuft.
Dieser Code sollte für Sie funktionieren. Ich ändere Ihre Eigenschaften in Auto-Eigenschaften und definierte eine statische CompareCarSpecs-Methode, die nur die bereits vorhandene DateTime.CompareTo-Methode verwendet.
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);
}
}
Hoffe das hilft.
Einige der hier genannten Stücke zusammenstellen. Dies kompiliert und funktioniert in C # 4.x und VS2010. Ich habe mit einer WinForm
getestet. Fügen Sie also die Methode der WinForm
Main()
hinzu. Sie benötigen mindestens die Assemblys System.Linq
und System.Generic.Collection
s.
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; }
}
Wenn Sie nach einer effizienten Sortiermethode suchen, würde ich von der Verwendung von Bubblesortierung abraten und stattdessen eine schnelle Sortierung durchführen. Diese Seite bietet eine ziemlich gute Erklärung des Algorithmus:
http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=574
Viel Glück!
Ich würde es vermeiden, meinen eigenen Sortieralgorithmus zu schreiben, aber wenn Sie trotzdem wollen, schauen Sie unter http://www.sorting-algorithms.com/ nach einigen Zusammenhängen verschiedener Sortieralgorithmen ...
Wenn Sie 2.0 verwenden, kann die folgende Diskussion hilfreich sein: C # -Liste <> Nach x sortieren, dann y
Wenn Sie Delegaten (auch als anonyme Methoden bezeichnet) verwenden, müssen Sie keine IComparer/IComparable-Schnittstellen implementieren.
public static void Main(string[] args)
{
List<CarSpecs> list = new List<CarSpecs>();
list.Add(new CarSpecs("Focus", "Ford", new DateTime(2010,1, 2));
list.Add(new CarSpecs("Prius", "Toyota", new DateTime(2012,3, 3));
list.Add(new CarSpecs("Ram", "Dodge", new DateTime(2013, 10, 6));
list.Sort(delegate (CarSpecs first, CarSpecs second)
{
int returnValue = 1;
if((first != null & second != null))
{
if (first.CarName.Equals(second.CarName))
{
if (first.CarMaker.Equals(second.CarMaker))
{
returnValue = first.CreationDate.CompareTo(second.CreationDate);
}
else
{
returnValue = first.CarMaker.CompareTo(second.CarMaker);
}
}
else
{
returnValue = first.CarName.CompareTo(second.CarName);
}
}
return returnValue;
});
}