[英]How to compare (greater than less than) objects of unknown type?
需要使靜態Sorter類(氣泡排序,插入排序等)對我在編譯時不知道類型的對象進行排序(數組,列表,無論我想要什么)。
了解排序算法不是我的問題,我只想知道如何比較兩個對象(例如字符串),而不必使我的Bubble Sort方法必須檢查類型,然后重定向到適用於該數據類型的代碼塊。
只要存儲在集合中的所有對象都是相同的類型,我該如何制作一種對任何數據類型都適用的氣泡排序方法/代碼塊。
我可以使排序算法與int一起使用,因為這很直觀,您可以將int與基本操作數(如<和> =)進行比較。 我真的不知道如何甚至開始制作可以對任何類型進行排序的方法。 我見過有人提到實現可比較或可枚舉的接口,但是如果我要傳遞一個我從未見過的對象數組,或者在編譯代碼結束之前不知道該怎么辦?
一種實現方法是編寫一個通用方法,該方法強制該類型實現IComparable<T>
接口,然后可以使用該接口的.CompareTo
方法進行排序。
例如:
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...");
}
產量
另一種方式,使用IComparer<T>
。
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)
這就像寫作
if (array[j + 1] < array[j])
除了它使您可以使用自己的比較函數外,該函數可能與T本身為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
和System.String
是ASCIIbetical順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.