2

intMethod と doubleMethod の 2 つのメソッドがありますが、intMethod が int 配列パラメーターを受け取り、doubleMethod が double 配列パラメーターを受け取ることを除いて、それらはまったく同じです。

オーバーロードを使用して同じメソッド名を使用できることはわかっていますが、それでもパラメーターだけが異なる 2 つのほぼ同一のメソッドになってしまいます。intMethod と doubleMethod を 1 つのメソッドに結合できる方法はありますか?

もしそうなら、いくつかのサンプルコードを提供できますか? 私はいくつかのサンプルコードではるかにうまく従うことができます. ありがとう

編集:人々は私の方法を投稿するように私に要求します、そしてあなたはそこに行きます:

データ配列が double[][] である同一のメソッド 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]);
        }
    }
4

4 に答える 4

5

メソッド自体が何をするかに大きく依存します。

メソッドが などの共有インターフェイスの観点から記述できる場合は、IComparable<T>潜在的にそれをジェネリック メソッドにすることができます。

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

これはどのタイプでも機能しますが、動的バインディングを使用するため、チェックは実質的にランタイムに移動します。適切に機能しない型を渡すと、(コンパイル時のチェックではなく) 実行時例外が発生します。

于 2012-09-26T18:05:30.407 に答える
1

genericを使用できます。単純な Swap メソッドは、Swap をオーバーロードして Swap メソッドにさまざまな型を渡す方法を理解するのに役立ちます。

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);
于 2012-09-26T18:05:19.580 に答える
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
    }
于 2012-09-26T18:16:13.637 に答える
0

あなたの例を見ると、ジェネリックと a を使用してほとんどの重複を簡単に削除できFuncます。これは 1 つの方法です。

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

もちろん、おそらくさらに多くのリファクタリングを行うことができますが、これにより、ほとんど同じメソッドの特定の問題が解決されるはずです。

于 2012-09-26T18:26:56.370 に答える