这是我的重构问题的第2部分。我在这里成功地重构了我以前的方法:
how do i refactor these 2 methods?
第二部分类似,但我无法成功重构这两种方法。当使用通用方法时,我陷入困境:
temp = (T)Convert.ToInt(value);
所以不知怎的,我需要一种不同的方法来重构这两种方法。
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]);
}
}
如果有人发布了一些有关此问题的工作片段,我会感激不尽,我该怎么称呼它。
感谢。
答案 0 :(得分: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()
方法将其转换为任何其他(支持的)类型。支持对基本类型的转换,对于不那么简单的转换,您可以考虑使用转换库,如Universal Type Converter。请注意,现在转换需要IFormatProvider
(例如,对于不同的文化,双打表示不同的方式)。