需要使静态Sorter类(气泡排序,插入排序等)对我在编译时不知道类型的对象的集合(数组,列表,无论我想要什么)进行排序。
了解排序算法不是我的问题,我只想知道如何比较两个对象(例如字符串),而不必使我的Bubble Sort方法必须检查类型,然后重定向到适用于该数据类型的代码块。
只要存储在集合中的所有对象都属于同一类型,我该如何制作一种适用于任何数据类型的气泡排序方法/代码块。
我可以使排序算法与int一起使用,因为这很直观,您可以将int与基本操作数(如<和> =)进行比较。我真的不知道如何甚至开始制作可以对任何类型进行排序的方法。我见过人们提到实现可比较或可枚举的接口,但是如果我要传递一个我以前从未见过的对象数组,或者在编译代码结尾之前不知道该怎么办?
答案 0 :(得分:3)
执行此操作的一种方法是编写一个通用方法,该方法强制该类型实现IComparable<T>
接口,然后可以使用该接口的.CompareTo
方法进行排序。 / p>
例如:
private static IEnumerable<T> Sort<T>(IEnumerable<T> input) where T : IComparable<T>
{
var results = input.ToList();
for (int counter = 0; counter < results.Count; counter++)
{
for (int index = 0; index < results.Count - 1; index++)
{
if (results[index].CompareTo(results[index + 1]) > 0)
{
var temp = results[index + 1];
results[index + 1] = results[index];
results[index] = temp;
}
}
}
return results;
}
用法示例:
private static void Main()
{
string[] strArray = {"will", "this", "sort", "correctly"};
int[] intArray = {3, 4, 7, 2, 1};
Console.WriteLine(string.Join(", ", Sort(strArray)));
Console.WriteLine(string.Join(", ", Sort(intArray)));
GetKeyFromUser("\nDone! Press any key to exit...");
}
输出
答案 1 :(得分:1)
另一种方式,使用IComparer<T>
。
function sql_source($table, $name, $conn) {
$conn->setAttribute(...);
...
}
sql_source("table", "name", $conn); // Calling the function
重要的一行是:
public static void BubbleSort<T>(T[] array, IComparer<T> comparer)
{
if (comparer == null)
{
comparer = Comparer<T>.Default;
}
for (int i = array.Length; i >= 0; --i)
{
bool swapped = false;
for (int j = 0; j < i - 1; ++j)
{
if (comparer.Compare(array[j + 1], array[j]) < 0)
{
T temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
swapped = true;
}
}
if (swapped == false)
{
break;
}
}
}
这就像写作
if (comparer.Compare(array[j + 1], array[j]) < 0)
除了它使您可以使用自己的比较函数外,它可能与T本身为 if (array[j + 1] < array[j])
或operator <
定义的类完全无关。
例如,您可以按混合类型的类型名称对其进行排序。
IComparable<T>.CompareTo
这将产生如下输出:
class TypeNameComparer : IComparer<object>
{
public int Compare(object x, object y)
{
x.GetType().FullName.CompareTo(y.GetType().FullName);
}
}
private static void Main()
{
object[] mixed = {42, "Hello, world!", System.Guid.NewGuid()};
BubbleSort(mixed, new TypeNameComparer());
foreach (object obj in mixed)
{
System.Console.WriteLine(obj);
}
}
因为b5852625-cee2-479d-bfd5-7d3f01e78529
42
Hello, world!
,System.Guid
和System.Int32
采用ASCIIbetical顺序。