1

これは私のリファクタリング問題のパート2です。私はここで以前の方法を正常にリファクタリングしました:

これら2つの方法をリファクタリングするにはどうすればよいですか?

2番目の部分も同様ですが、この2つの方法を正常にリファクタリングすることはできません。一般的な方法を使用するとき、私は次の行で立ち往生しました:

temp = (T)Convert.ToInt(value); 

したがって、どういうわけか、これら2つの方法をリファクタリングするための別のアプローチが必要です。

public static void readDataDouble(string value, ref double[][] 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(',');
        }
    }
    date = new DateTime[temp.Length - 1];
    timeframe = new DateTime[temp[0].Length - 1];
    data = new double[temp.Length - 1][];

    for (int i = 1; i < temp.Length; i++)
    {
        data[i - 1] = new double[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.ToDouble(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]);
    }
}

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] = DateTime.Parse(temp[i][0]);
    }

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

誰かがこの問題にいくつかの実用的なスニペットを投稿してくれたら、どうすればそれを呼び出すことができますか?

ありがとう。

4

1 に答える 1

1

ジェネリックを再び使用できます。

    public static void readDataInt<T>(string value, ref T[][] 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(',');
            }
        }

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

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

            for (int j = 1; j < temp[i].Length; j++)
            {
                if (temp[i][j].Length > 0)
                    data[i - 1][j - 1] = (T)((IConvertible)temp[i][j]).ToType(typeof(T),
                        System.Globalization.CultureInfo.InvariantCulture);
            }
        }

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

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

ここでも、強く型付けされた配列をその一般的な対応する配列に変更する必要があります。これに加えて、唯一の注目すべき変更は、変換が行われる行です。stringを実装しているため、メソッドを使用して他の(サポートされている)タイプに変換IConvertibleできます。IConvertible.ToType()プリミティブ型への変換がサポートされています。簡単でない変換の場合は、UniversalTypeConverterなどの変換ライブラリの使用を検討してください。IFormatProviderここで、変換には(たとえば、文化ごとに異なる方法で表されるdoubles)が必要であることに注意してください。

于 2012-09-27T11:45:12.387 に答える