Bí quyết là triển khai loại ổn định. Tôi đã tạo một lớp Tiện ích con 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 IComparable, do đó, nó có thể được sắp xếp không ổn định bởi List.Sort().
Tuy nhiên, tôi cũng đã triển khai phương pháp tĩnh So sánh, có thể được chuyển làm đại biểu cho phương thức tìm kiếm.
Tôi mượn cách 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 này trong lớp giúp đỡ loại mà bạn đề cập trong câu hỏi của bạn.
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ó ra:
0:1
0:2
1:1
1:2
Press any key to continue . . .
này có thể có thể được làm sạch với một số đại biểu vô danh, nhưng tôi sẽ rời khỏi đó tùy thuộc vào bạn.
EDIT: Và NoBugz thể hiện sức mạnh của các phương thức nặc danh ...vì vậy, hãy xem xét trường cũ của tôi: P
@Bolu Tôi đã gỡ bỏ một cách rõ ràng thẻ để thực hiện bài bản câu trả lời thuyết bất khả tri và được cập nhật để phù hợp đó. Cân nhắc thực hiện chỉnh sửa rõ ràng trong câu hỏi thay vì khôi phục thẻ nếu bạn cho rằng 4.0/2.0 không đủ nổi bật. –
Xin lỗi @AlexeiLevenkov, đã không chú ý nhiều, vui lòng quay lại. – Bolu
OK. Đã hoàn nguyên thay đổi. –