2016-12-15 80 views
0

所以我想做一個通用的方法,讓你插入一個特定長度的數組,並在同一時間對它進行排序。 所以我從int到普通的牛逼transfering它,我無意中發現了一個問題,而試圖比較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>:有問題的類實現的方法CompareTo

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

IComparable需求。現在,編譯器應該停止抱怨,

「T」不包含定義「的CompareTo」,並不能找到一個擴展方法「的CompareTo」

編輯:

這條線可以得到你很容易陷入困境:

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納入thx –

+0

@SuperMinefudge沒有問題。 –