如何比较(大于小于)未知类型的对象?

时间:2019-02-18 23:14:58

标签: c# .net

需要使静态Sorter类(气泡排序,插入排序等)对我在编译时不知道类型的对象的集合(数组,列表,无论我想要什么)进行排序。

了解排序算法不是我的问题,我只想知道如何比较两个对象(例如字符串),而不必使我的Bubble Sort方法必须检查类型,然后重定向到适用于该数据类型的代码块。

只要存储在集合中的所有对象都属于同一类型,我该如何制作一种适用于任何数据类型的气泡排序方法/代码块。

我可以使排序算法与int一起使用,因为这很直观,您可以将int与基本操作数(如<和> =)进行比较。我真的不知道如何甚至开始制作可以对任何类型进行排序的方法。我见过人们提到实现可比较或可枚举的接口,但是如果我要传递一个我以前从未见过的对象数组,或者在编译代码结尾之前不知道该怎么办?

2 个答案:

答案 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...");
}

输出

![enter image description here

答案 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.GuidSystem.Int32采用ASCIIbetical顺序。