Der Trick besteht darin, eine stabile Sortierung zu implementieren. Ich habe eine Widget-Klasse erstellt, die Ihre Testdaten enthalten kann:
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;
}
}
Ich habe IComparable implementiert, damit es instabil nach List.Sort () sortiert werden kann.
Ich habe jedoch auch die statische Methode Compare implementiert, die als Delegat an eine Suchmethode übergeben werden kann.
Ich habe diese Einfügesortiermethode von C # 411 ausgeliehen :
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;
}
}
Sie würden dies in die Klasse Helfer Klasse setzen, die Sie in Ihrer Frage erwähnt haben.
Nun, um 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 aus:
0:1
0:2
1:1
1:2
Press any key to continue . . .
Dies könnte wahrscheinlich mit einigen anonymen Delegierten aufgeräumt werden, aber das überlasse ich Ihnen.
EDIT : Und NoBugz demonstriert die Macht anonymer Methoden ... also betrachten Sie meine mehr oldschool: P.