Triknya adalah dengan menerapkan semacam stabil. Saya telah membuat kelas Widget yang dapat berisi data pengujian Anda:
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;
}
}
Saya menerapkan IComparable, sehingga dapat diurutkan secara tidak stabil berdasarkan List.Sort ().
Namun, saya juga menerapkan metode Bandingkan statis, yang dapat dikirimkan sebagai delegasi ke metode pencarian.
Saya meminjam metode penyisipan semacam ini dari 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;
}
}
Anda akan memasukkan ini ke dalam kelas penolong yang Anda sebutkan dalam pertanyaan Anda.
Sekarang, untuk menggunakannya:
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);
}
}
Dan itu menghasilkan:
0:1
0:2
1:1
1:2
Press any key to continue . . .
Ini mungkin bisa dibersihkan dengan beberapa delegasi anonim, tapi saya serahkan pada Anda.
EDIT : Dan NoBugz mendemonstrasikan kekuatan metode anonim ... jadi, pertimbangkan sekolah saya yang lebih tua: P