2012-09-26 80 views
2

我有2個方法,intMethod和doubleMethod,它們完全一樣,除了intMethod接受一個int數組參數,doubleMethod接受一個雙數組參數。int和double的重載問題

我知道我可以使用重載使用相同的方法名稱,但是,我仍然結束了兩個幾乎相同的方法,只有它們的參數不同。無論如何,我可以將intMethod和doubleMethod結合到一個方法中嗎?

如果是這樣,你能提供一些示例代碼嗎?我可以更好地使用一些示例代碼。感謝

編輯:人們要求我發表我的方法,而且你去:

我有一個相同的方法,readDataDouble,該數據陣列是雙[] []

基本上這個方法讀一個CSV文件並將數據轉換爲int格式。第一行是時間,第一列是日期。

public static void readDataInt(string value, ref int[][] data, ref DateTime[] timeframe, ref DateTime[] date) 
    { 
     string inputFile = "D:\\temp.csv"; 
     string[][] temp = null; 

     if (File.Exists(inputFile)) 
     { 
      string[] proRataVolumeFile = File.ReadAllLines(inputFile); 
      temp = new string[proRataVolumeFile.Length][]; 

      for (int i = 0; i < proRataVolumeFile.Length; i++) 
      { 
       temp[i] = proRataVolumeFile[i].Split(','); 
      } 
     } 

       //convert the string to int 

     date = new DateTime[temp.Length - 1]; 
     timeframe = new DateTime[temp[0].Length - 1]; 
     data = new int[temp.Length - 1][]; 

     for (int i = 1; i < temp.Length; i++) 
     { 
      data[i - 1] = new int[temp[i].Length - 1]; 

      for (int j = 1; j < temp[i].Length; j++) 
      { 
       if (temp[i][j].Length > 0) 
        data[i - 1][j - 1] = Convert.ToInt32(temp[i][j]); 
      } 
     } 

     for (int i = 1; i < temp.Length; i++) 
     { 
      date[i - 1] = Convert.ToDateTime(temp[i][0]); 
     } 

     for (int j = 1; j < temp[0].Length; j++) 
     { 
      timeframe[j - 1] = DateTime.Parse(temp[0][j]); 
     } 
    } 
+0

您是否嘗試過使用泛型? '方法(T [] array)'? – carlosfigueira

+2

「幾乎相同」!=相同。如果您發佈該方法,這將有所幫助。 –

+0

我們也可以使用一些示例代碼更好地遵循:)如果知道正在處理的內容,可以添加方法,因爲「重構」要容易得多。 –

回答

1

您可以使用generic,簡單的交換方法,可以幫助你瞭解如何通過不同類型來交換方法超載交換。

static void Swap<T>(ref T lhs, ref T rhs) 
{ 
    T temp; 
    temp = lhs; 
    lhs = rhs; 
    rhs = temp; 
} 

您將如何呼籲INT

int a = 2; 
int b = 3; 
Swap<int>(ref a, ref b); 

您將如何調用雙

double a = 2.3; 
double b = 5.7; 
Swap<double>(ref a, ref b); 
5

這在很大程度上取決於什麼方法本身一樣。

如果該方法可以在共享接口的角度來寫,如IComparable<T>,你有可能使其成爲一個generic method

void SomeMethod<T>(T[] values) where T : IComparable<T> 
{ 
    // Do stuff here 
} 

這將是更嚴格的,但是,你只能使用方法或通用約束定義的屬性。它適用於需要比較值或檢查相等性等情況,但對「通用數學」不適用,因爲沒有可用的共享接口(例如理論接口IArithmetic<T>)。

編輯:在你的情況,你應該能夠使用受限於IConvertible實現一個通用的方法:

public static void ReadData<T>(string value, ref T[][] data, ref DateTime[] timeframe, ref DateTime[] date) where T : IConvertible 
{ 

另一種選擇是宣佈你的方法使用dynamic,而不是特定類型的:

dynamic SomeMethod(dynamic[] values) 
{ 
    dynamic result = values[0]; 
    for (int i = 1; i < values.Length; ++i) 
     result = result + values[i]; // You can use normal operators now 
    return result; 
} 

這將適用於任何類型,但檢查有效地移動到運行時,因爲它使用動態綁定。如果你傳遞了一個不能正常工作的類型,你會得到運行時異常(而不是編譯時檢查)。

+0

的方法謝謝。問題:如果我聲明我的變量爲VAR,我可以解決這個問題,並且只使用varMethod?使用VAR而不是int或double的任何潛在陷阱? (除了比較慢?) –

+0

@ClaytonLeung否 - 「var」只是一個編譯器推理。你不能在一個參數中使用它。你*可以*使用動態來解決這個限制 - 將編輯顯示。 –

+0

謝謝,我現在還在使用.net 3.5,當我有時間的時候,我會再次檢查這個部分,我也發佈了我的方法,隨時查看,看看有沒有什麼可以改進的地方 –

0

您可以使用仿製藥,你的數組轉換成列表,然後創建一個通用的方法來處理這樣的數據:

int[] ints = {1, 2, 3 }; 
    List<int> listInts = ints.ToList(); 

    MyMethod<int>(listInts); 

    private static void MyMethod<T>(List<T> genericList) 
    { 
     // do you work 
    } 
+0

但是你仍然需要構造2個列表,列表和列表,當您稍後進行計算時,您會遇到投射問題? –

0

看到你的榜樣,它很容易去除大部分使用泛型的重複和Func,這是一種方式;

public static void ReadDataInt(string value, out int[][] data, 
         out DateTime[] timeframe, out DateTime[] date) 
    { 
     ReadData(value, out data, out timeframe, out date, Convert.ToInt32); 
    } 

    public static void ReadDataDouble(string value, out double[][] data, 
         out DateTime[] timeframe, out DateTime[] date) 
    { 
     ReadData(value, out data, out timeframe, out date, Convert.ToDouble); 
    } 

    private static void ReadData<T>(string value, out T[][] data, 
          out DateTime[] timeframe, out DateTime[] date, 
          Func<string, T> converter) 
    { 
     ...your method goes here with some very minor changes below. 

     // Generic instead of int/double 
     data = new T[temp.Length - 1][];   
     ... 
     // Generic instead of int/double 
     data[i - 1] = new T[temp[i].Length - 1]; 
     ... 
     // Use a func instead of the hard coded Convert. 
     if (temp[i][j].Length > 0) 
      data[i - 1][j - 1] = converter(temp[i][j]); 

當然,你可以做更多的重構,但這應該解決幾乎相同的方法的具體問題。

+0

謝謝,我想這裏的所有答案都使自己超負荷。有沒有比較喜歡的方法?我仍然是新的,所以所有的泛型和Ienumerable對我來說都是陌生的,無論如何我必須學習。 –

+0

@ClaytonLeung看到你的示例代碼,我更新了答案。 –