2016-12-15 2 views
0

Так что я хотел создать общий метод, который сделает массив массивной длины, в которую вы вставляете, и сортирует ее одновременно. так я был перенося его от ИНТ к родовым T и я наткнулся на проблему, пытаясь сравнить 2 переменные Т. это код до сих пор:Сравнение общих значений

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication7 
{ 
class Program 
{ 
    public static T[] insertWhileSorting<T>(int x) 
    { 
     T[] arr = new T[x]; 
     for (int i = 0, k; i < arr.Length; i++) 
     { 
      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; 
     } 
     return arr; 
    } 
    static void Main(string[] args) 
    { 
     int[] arr = insertWhileSorting<int>(5); 
     Console.WriteLine(string.Join(", ", arr)); 
    } 
    } 
} 

и да я знаю (я думаю), что просто вставляя значения в массив, а затем сортируя их лучше, но я делаю это для назначения

+3

А * это * проблема, с которой вы сталкиваетесь? – HimBromBeere

+0

Вам нужно либо добавить ограничение, чтобы убедиться, что 'T' реализует' IComparable ' или передать в 'IComparer '. – juharr

ответ

3

Вам нужно будет утверждать, что тип T как реализован IComparable<T>. Используя ключевое слово where вы можете ограничить тип T с условием, что T должен реализовать IComparable<T>:

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

IComparable требования о том, что класс в вопросе реализует метод CompareTo. Теперь компилятор должен перестать жаловаться, что

«Т» не содержит определения для «CompareTo» и не может найти метод расширения «CompareTo»

EDIT:

эта линия может получить вы легко неприятности:

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

, поскольку пользователь может ввести просто строку типа "break", которая привела бы к FormatException если вы изначально назвали его так:

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

Вы можете поместить всю эту конверсию и сортировки рутина в статье в trycatch и дать предупреждение, когда он выходит из строя:

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); 
    } 

} 
+2

Лучше будет ICompareable CSharpie

+0

@CSharpie included thx –

+0

@SuperMinefudge проблем нет. –

Смежные вопросы