Der Trick besteht darin, eine stabile Sortierung zu implementieren. Ich habe ein Widget-Klasse erstellt, die Ihre Testdaten enthalten:
public class Widget : IComparable
{
int x;
int y;
public int X
{
get { return x; }
set { x = value; }
}
public int Y
{
get { return y; }
set { y = value; }
}
public Widget(int argx, int argy)
{
x = argx;
y = argy;
}
public int CompareTo(object obj)
{
int result = 1;
if (obj != null && obj is Widget)
{
Widget w = obj as Widget;
result = this.X.CompareTo(w.X);
}
return result;
}
static public int Compare(Widget x, Widget y)
{
int result = 1;
if (x != null && y != null)
{
result = x.CompareTo(y);
}
return result;
}
}
I implementiert IComparable, so kann es unstabil durch List.Sort() sortiert werden.
Allerdings habe ich auch die statische Methode Compare implementiert, die als Delegat an eine Suchmethode übergeben werden kann.
Ich lieh mir diese Insertionsort Methode von C# 411:
public static void InsertionSort<T>(IList<T> list, Comparison<T> comparison)
{
int count = list.Count;
for (int j = 1; j < count; j++)
{
T key = list[j];
int i = j - 1;
for (; i >= 0 && comparison(list[i], key) > 0; i--)
{
list[i + 1] = list[i];
}
list[i + 1] = key;
}
}
du in der Sortier Helfer Klasse setzen würde, die Sie in Ihrer Frage erwähnt.
Nun, es zu benutzen:
static void Main(string[] args)
{
List<Widget> widgets = new List<Widget>();
widgets.Add(new Widget(0, 1));
widgets.Add(new Widget(1, 1));
widgets.Add(new Widget(0, 2));
widgets.Add(new Widget(1, 2));
InsertionSort<Widget>(widgets, Widget.Compare);
foreach (Widget w in widgets)
{
Console.WriteLine(w.X + ":" + w.Y);
}
}
Und es gibt:
0:1
0:2
1:1
1:2
Press any key to continue . . .
Dies ist wahrscheinlich mit einigen anonymen Delegierten gereinigt werden konnte, aber ich werde das für Sie überlassen.
EDIT: Und NoBugz demonstriert die Macht der anonymen Methoden ...Also, betrachte meine mehr oldschool: P
@Bolu Ich habe ausdrücklich helfen kann die Tag-Post-Version Agnostiker und aktualisiert Antworten zu machen, dass anzupassen. Ziehen Sie in Betracht, die Frage zu klären, anstatt das Tag wiederherzustellen, wenn Sie der Meinung sind, dass 4.0/2.0 nicht prominent genug ist. –
Sorry @AlexeiLevenkov, hat nicht viel Aufmerksamkeit geschenkt, wenden Sie sich bitte an Rollback. – Bolu
OK. Die Änderung rückgängig gemacht. –