关于int和double的重载问题

时间:2012-09-26 18:03:29

标签: c# overloading

我有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]);
        }
    }

4 个答案:

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

当然,你可以做更多的重构,但这应该解决几乎相同方法的具体问题。