簡體   English   中英

如何比較(大於小於)未知類型的對象?

[英]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.GuidSystem.Int32System.String是ASCIIbetical順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM