如何删除此重复的代码

时间:2013-04-08 11:43:47

标签: c# duplicate-removal

我在两个地方有相同的代码:

if (amountUnit.ToLower().Contains("x"))
{
    string[] amount = amountUnit.Split('x');
    x = amount[0].Trim();
    y = amount[1].Trim();
}
else
{
    x = "1";
    y = amountUnit.Trim();
}
//
unit = textInBrackets.Replace(amountUnit, "");
name = "";
for (int z = 0; z < i; z++)
{
    name += someArray[z];
    name += " ";
}
name = name.Trim();

确切的代码重复两次。怎么解决?如果我用一种新方法提取它,我会有很多ref输入参数。还有另外一种方法吗? 如果不可能,只是部分直到评论?

4 个答案:

答案 0 :(得分:0)

代码似乎在逻辑上有两个独立的块。

一个处理xy - 另一个处理name。这些应该是单独的方法。

现在,您可以创建一个封装xy的类型(类或结构),这意味着您只需要传入一个参数。您可以通过返回而不是通过ref传递它,而是在调用者中替换您传入的内容。

答案 1 :(得分:0)

将您的代码和数据合并到一个类中; - )

public class Point
{
    public Point(string amountUnit)
    {
        if (amountUnit == null)
        {
            throw new ArgumentNullException("amountUnit");
        }

        if (amountUnit.ToLower().Contains("x"))
        {
            string[] amount = amountUnit.Split('x');
            this.X = amount[0].Trim();
            this.Y = amount[1].Trim();
        }
        else
        {
            this.X = "1";
            this.Y = amountUnit.Trim();
        }
    }

    string X { get; private set; }
    string Y { get; private set; }
}

答案 2 :(得分:0)

像:

public struct Parameters
{
    public int X {get; set;}
    public int Y {get; set;}
}

public Parameters ExtractParameters(string amountUnit)
{    
    var parameters = new Parameters();
    if (amountUnit.ToLower().Contains("x"))
    {
        string[] amount = amountUnit.Split('x');
        parameters.X = int.Parse(amount[0].Trim());
        parameters.Y = int.Parse(amount[1].Trim());
    }
    else
    {
        parameters.X = 1;
        parameters.Y = int.Parse(amountUnit.Trim());
    }
    return parameters;
} 

用法:

var parameters = ExtractParameters(amountUnit);
var x = parameters.X;
var y = parameters.Y; 

您还可以将其作为字符串的扩展方法。 当然,您最好也添加一些异常处理。

答案 3 :(得分:0)

如果你不需要任何非常动态的东西,如何将它分成两个方法,并做一些简单的事情:

public static string GetX(string amountUnit)
{
    return amountUnit.ToLower().Contains("x") ? 
                        amountUnit.Split('x')[0].Trim() : 
                        "1";
}

public static string GetY(string amountUnit)
{
    return amountUnit.ToLower().Contains("x") ? 
                        amountUnit.Split('x')[1].Trim() :       
                        amountUnit.Trim();
}