1
    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;
        }
    }

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

我该怎么称呼它?

编辑:非常感谢您的回答,我有另一个更复杂的案例需要重构,这里的建议不适用于这两种方法。请点击此链接了解更多详情

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

4

4 回答 4

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);
    }

有什么改变?

首先是方法签名:它接受一个通用类型的数组(T所以不管它是intdouble还是)。boolstrings

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

最后,您只需清除数组(再次为零),这样您就可以简单地使用它Array.Clear()来完成所有工作(它甚至比手工制作的还要快一点for)。

于 2012-09-27T10:12:23.807 回答
2

其他答案是正确的,使用泛型是最好的,在这里我只是使用 Linq 重构你的代码,以便更清洁:

public static void outputDetail<T>(DateTime previousTime, ref T[] array, 
                                   StreamWriter streamWriter) where T : struct
{
    if (array.Any(a => !a.Equals(default(T))))
    {
        string outputString = string.Join(",", 
                                          previousTime.ToString("yyyy/MM/dd"),
                                          string.Join(",", array));

        streamWriter.WriteLine(outputString);
    }

    array = Enumerable.Repeat(default(T), array.Length).ToArray();
}
于 2012-09-27T10:45:51.683 回答
0

这应该有效。顺便说一句,像这样连接字符串是 GC 的负担,看看 StringBuilder 类。

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

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

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

        for (int i = 0; i < array.Length; i++)
        {
            array[i] = default(T);
        }
    }
于 2012-09-27T10:14:28.183 回答
0

只是另一种想法,就像在 Java 中一样,您可以创建一个名为 Number 的抽象类,Integer、Doubles 等从这个抽象类继承。然后,您可以将数组替换为数字数组。这是可扩展的,您可以混合类型。

此示例适用于 Java,但给出了想法。http://www.daniweb.com/software-development/java/threads/185870/one-method-for-stack-of-either-integer-or-double-parameters

public abstract class Number
{
}



public static void outputDetail(DateTime previousTime, ref Number[] 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;
    }
}

这是关于该主题的有趣讨论。http://www.dreamincode.net/forums/topic/261696-a-abstract-number-class/

于 2012-09-27T10:41:52.307 回答