比较通用值

时间:2016-12-15 13:23:57

标签: c# sorting generics

所以我想制作一个通用方法,使你成为一个插入特定长度的数组,并同时对其进行排序。 所以我把它从int转移到通用T我在试图比较T的2个变量时偶然发现了一个问题。 这是到目前为止的代码:

return $this->render('buildings/index.html.twig', [
     'buildings' => $this->getDoctrine()->getRepository(Building::class)->findByIsland($island)
]);

是的,我知道(我认为)只是将值插入数组然后对其进行排序更好,但我正在为分配做这件事

1 个答案:

答案 0 :(得分:3)

您需要声明类型T已实施IComparable<T>。使用where关键字,您可以使用T必须实施T的条件来限制类型IComparable<T>

 public static T[] insertWhileSorting<T>(int x) where T: IComparable<T>

IComparable要求相关的类实现方法CompareTo。现在编译器应该停止抱怨

  

&#34; T&#34;不包含&#34; CompareTo&#34;的定义并且找不到扩展方法&#34; CompareTo&#34;

编辑:

这条线可以让你轻松陷入困境:

T value = (T)Convert.ChangeType(Console.ReadLine(), typeof(T));

因为用户可以只键入一个像"break"这样的字符串,如果您最初这样调用它会导致FormatException

int [] adda = insertWhileSorting<int>(5);

您可以将整个转化和排序例程放入try catch子句中,并在崩溃时发出警告:

for (int i = 0, k; i < arr.Length; i++)
{
    try
    {
        T value = (T)Convert.ChangeType(Console.ReadLine(), typeof(T));

        for (k = i; k > 0 && value.CompareTo(arr[k - 1]) < 0; --k) arr[k] = arr[k - 1];

        arr[k] = value;
    }
    catch (Exception ex)
    {
        Console.WriteLine("That stuff was not convertible!");
        Console.WriteLine("Error: " + ex.Message);
    }

}