我如何重构这两种方法?

Cla*_*ung 1 c# refactoring

    public static void outputDetail(DateTime previousTime, ref double[] array, StreamWriter streamWriter)  //the parameter in here is not necessary, but want to maintain a similiarity in the TimeOfDay class
    {
        string outputString = previousTime.ToString("yyyy/MM/dd");
        Boolean bypass = true;

        for (int i = 1; i < array.Length - 1; i++)
        {
            outputString = outputString + "," + array[i].ToString();

            if (array[i] != 0)
                bypass = false;
        }
        if (bypass == false)
            streamWriter.WriteLine(outputString);

        for (int i = 0; i < array.Length; i++)
        {
            array[i] = 0;
        }
    }


    public static void outputDetail(DateTime previousTime, ref int[] array, StreamWriter streamWriter)  //the parameter in here is not necessary, but want to maintain a similiarity in the TimeOfDay class
    {
        string outputString = previousTime.ToString("yyyy/MM/dd");
        Boolean bypass = true;

        for (int i = 1; i < array.Length -1; i++)
        {
            if (array[i] != 0)
            {
                outputString = outputString + "," + array[i].ToString();
                bypass = false;
            }
            else
            {
                outputString = outputString + ",";
            }
        }
        if (bypass == false)
            streamWriter.WriteLine(outputString);

        for (int i = 0; i < array.Length; i++)
        {
            array[i] = 0;
        }
    }
Run Code Online (Sandbox Code Playgroud)

它们完全相同,只有一个采用双数组,一个采用int数组,我看到一些例子使用Iconvertible但我不能正确使用语法.有人可以为方法发布一些可行的片段吗?

我怎么称呼它?

编辑:非常感谢答案,我有另一个更复杂的情况我需要重构,这里的建议不适用于这两种方法.请单击此链接以获取更多详细信息

我如何重构这两种方法?第2部分.

Adr*_*tti 5

将您的代码更改为:

    public static void outputDetail<T>(DateTime previousTime, ref T[] array, System.IO.StreamWriter streamWriter)  //the parameter in here is not necessary, but want to maintain a similiarity in the TimeOfDay class
    {
        string outputString = previousTime.ToString("yyyy/MM/dd");
        Boolean bypass = true;

        for (int i = 1; i < array.Length - 1; i++)
        {
            if (!Object.Equals(array[i], default(T)))
            {
                outputString = outputString + "," + array[i].ToString();
                bypass = false;
            }
            else
            {
                outputString = outputString + ",";
            }
        }
        if (bypass == false)
            streamWriter.WriteLine(outputString);

        Array.Clear(array, 0, array.Length);
    }
Run Code Online (Sandbox Code Playgroud)

改变了什么?

首先,方法签名:它接受类型的通用阵列T(所以如果它也没关系int,double,boolstrings).

现在你必须将比较修正为零.零是int和double的默认值,因此您可以使用default(T)获取实际类型的默认值并Object.Equals()进行比较(==并且!=没有为泛型类型定义运算符).

最后你只需清除阵列(再次为零),这样你就可以简单地Array.Clear()用来完成所有工作(而且它甚至比手工制作更快for).