2

我有 2 个方法,intMethod 和 doubleMethod,它们完全相同,除了 intMethod 采用 int 数组参数,而 doubleMethod 采用 double 数组参数。

我知道我可以使用重载来使用相同的方法名称,但是,我最终还是得到了 2 个几乎相同的方法,只是它们的参数不同。无论如何我可以将 intMethod 和 doubleMethod 组合成一种方法吗?

如果是这样,你能提供一些示例代码吗?我可以通过一些示例代码更好地遵循。谢谢

编辑:人们要求我发布我的方法,然后你去:

我有一个相同的方法,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]);
        }
    }
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

看到您的示例,使用泛型和 a 删除大部分重复项相当容易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]);

当然,您可能还可以进行更多重构,但这应该可以解决几乎相同方法的具体问题。

于 2012-09-26T18:26:56.370 回答
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 回答