这段代码有没有办法去除重复部分?

5

i have a method that looks like this:

   private double GetX()
    {
        if (Servings.Count > 0)
        {
            return Servings[0].X;
        }
        if (!string.IsNullOrEmpty(Description))
        {
            FoodDescriptionParser parser = new FoodDescriptionParser();
            return parser.Parse(Description).X;
        }
        return 0;
    }

我还有另一种方法,看起来像这样:

  private double GetY()
    {
        if (Servings.Count > 0)
        {
            return Servings[0].Y;
        }
        if (!string.IsNullOrEmpty(Description))
        {
            FoodDescriptionParser parser = new FoodDescriptionParser();
            return parser.Parse(Description).Y;
        }
        return 0;
    }

有没有办法将这个合并,因为唯一不同的是属性名称?

你使用的是哪个版本的.NET?我可以想到一些在.NET 4中实现它的好方法。 - sblom
如果您有很多这样的属性,可以使用反射(PropertyDescriptor)。但反射倾向于较为缓慢,如果只有2-3个属性,则不值得使用。 - dbkk
@sblom - 3.5是dotnet的版本。 - leora
我认为.NET版本并不重要,但C#版本非常重要。例如,Darin Dimitrov的答案依赖于lambda表达式,这是自C# 3.0以来可用的。在旧版本中,您可以使用匿名方法来实现类似的功能。 - Joren
3个回答

12

创建一个单独的 GetServing 方法:

private Serving GetServing() {
    if (Servings.Count > 0)
        return Servings[0];

    if (!string.IsNullOrEmpty(Description)) {
        FoodDescriptionParser parser = new FoodDescriptionParser();
        return parser.Parse(Description);
    }
    return null;
}

private double GetX() {
    Serving serving = GetServing();
    if (serving == null) return 0;
    return serving.X;
}

private double GetY() {
    Serving serving = GetServing();
    if (serving == null) return 0;
    return serving.Y;
}

2
你可以使用 return (serving == null) ? 0 : serving.X 来截取一行。 - dbkk
3
我比起Dimitrov的lambda方法更喜欢你的方法,因为你的方式更注重于程序的含义,而不是机制。 - Joren

9
private double Get(Func<SomeType, double> valueProvider)
{
    if (Servings.Count > 0)
    {
        return valueProvider(Servings[0]);
    }
    if (!string.IsNullOrEmpty(Description))
    {
        FoodDescriptionParser parser = new FoodDescriptionParser();
        return valueProvider(parser.Parse(Description));
    }
    return 0;
}

这可以像这样使用:

var x = Get(value => value.X);
var y = Get(value => value.Y);

注意: SomeTypeServings[0] 的类型,如果我正确理解你的代码,它应该与 parser.Parse(Description) 的类型相同。


聪明而干净,但我有一种感觉,这就像是在小钉子上使用大锤子。 - dbkk

0
假设parser.Parse()返回与Servings[]相同的类,您可以创建该类型的null object,其中X和Y都为零。然后,您可以编写一个函数,如果存在,则返回Servings[]的第一个元素,或者new FoodDescriptionParser.Parser(Description)(如果Description存在),或者最后是null对象。根据需要收集X或Y。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接