我正在尝试使用冒泡排序对类型<T>
的列表进行排序。不幸的是,我在比较未知类型的对象时遇到了问题。
到目前为止我尝试过:
public static void BubbleSort<T>(this List<T> array)
{
for (int i = (array.Count - 1); i >= 0; i--)
{
for (int j = 1; j <= i; j++)
{
if (array[j - 1] > array[j]) // issue here
{
var temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
}
}
答案 0 :(得分:14)
如果您不需要除默认比较之外的其他任何内容,则可以使用:
// TODO: Rename the parameter...
public static void BubbleSort<T>(this List<T> array)
{
IComparer<T> comparer = Comparer<T>.Default;
...
if (comparer.Compare(array[j - 1], array[j]) > 0)
{
...
}
}
或允许自定义比较:
public static void BubbleSort<T>(this List<T> array, IComparer<T> comparer)
{
...
if (comparer.Compare(array[j - 1], array[j]) > 0)
{
...
}
}
或者将T
限制为实施IComparable<T>
的类型:
public static void BubbleSort<T>(this List<T> array) where T : IComparable<T>
{
...
if (array[j - 1].CompareTo(array[j]) > 0)
{
...
}
}
请注意,在T
添加约束意味着任何调用者需要知道他们使用的类型参数需要实现IComparable<T>
...它使它更安全在编译时,代价是在调用链上向上传播约束。 (一种选择是允许没有比较器的受约束版本和带有比较器的无约束版本。)
答案 1 :(得分:8)
不,您无法将2 T
个值与>
进行比较。
首先,您需要在T
上添加约束:
public static void BubbleSort<T>(this List<T> array)
where T : IComparable<T>
{
}
然后你可以打电话
//if (array[j - 1] > array[j]) // issue here
if (array[j - 1].CompareTo(array[j]) > 0) // solved
答案 2 :(得分:0)