Bí quyết là thực hiện một loại ổn định. Tôi đã tạo một lớp Widget có thể chứa dữ liệu thử nghiệm của bạn:
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;
}
}
Tôi đã triển khai IComp so sánh được, vì vậy nó có thể được sắp xếp không ổn định theo List.Sort ().
Tuy nhiên, tôi cũng đã triển khai phương thức tĩnh Compare, phương thức này có thể được chuyển như một đại biểu cho một phương thức tìm kiếm.
Tôi đã mượn phương pháp sắp xếp chèn này từ 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;
}
}
Bạn sẽ đặt điều này vào lớp trợ giúp sắp xếp mà bạn đã đề cập trong câu hỏi của mình.
Bây giờ, để sử dụng nó:
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);
}
}
Và nó xuất ra:
0:1
0:2
1:1
1:2
Press any key to continue . . .
Điều này có thể được làm sạch với một số đại biểu ẩn danh, nhưng tôi sẽ để điều đó cho bạn.
CHỈNH SỬA : Và NoBugz thể hiện sức mạnh của các phương pháp ẩn danh ... vì vậy, hãy coi tôi là trường cũ hơn: P