我有2个方法,intMethod和doubleMethod,它们完全相同,除了intMethod采用int数组参数而doubleMethod采用double数组参数。
我知道我可以使用重载来使用相同的方法名称,但是,我仍然最终得到了两个几乎相同的方法,这些方法只是因参数而不同。无论如何我可以将intMethod和doubleMethod组合成1个方法吗?
如果是的话,你能提供一些示例代码吗?我可以通过一些示例代码更好地关注。谢谢
编辑:人们要求我发布我的方法,然后你去:
我有一个相同的方法readDataDouble,数据数组是double [] []
基本上这个方法读取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 :(得分: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;
}
这适用于任何类型,但检查有效地移动到运行时,因为它使用动态绑定。如果传递的函数不能正常运行,则会得到运行时异常(而不是编译时检查)。
答案 1 :(得分: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);
答案 2 :(得分: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
}
答案 3 :(得分: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]);
当然,你可以做更多的重构,但这应该解决几乎相同方法的具体问题。