我怎样才能重构一组丑陋的if语句?

时间:2016-01-18 17:04:00

标签: c# refactoring

我有一组这样的If语句可以正常工作,但看起来有点难看。有什么办法我可以把它搞砸而不是使用大的丑陋的if语句吗?问题是它使用了string.contains,这使得实现字典变得有点困难,我试过并失败了:(

这是:

foreach (var Item in Stuff)
            {
                var loweredQuoteItem = quoteItem.Name.ToLower();

                if (loweredQuoteItem.Contains("one"))
                    Item.InsurerNameShort = "Item One";

                if (loweredQuoteItem.Contains("two"))
                    Item.InsurerNameShort = "Item Two";

                if (loweredQuoteItem.Contains("chaucer"))
                    Item.InsurerNameShort = "Chaucer";

                if (loweredQuoteItem.Contains("three"))
                    Item.InsurerNameShort = "Item Three";

                if (loweredQuoteItem.Contains("four"))
                    Item.InsurerNameShort = "Item Four";

                if (loweredQuoteItem.Contains("five"))
                    Item.InsurerNameShort = "Item Five";

               }

2 个答案:

答案 0 :(得分:4)

  

问题是它使用了string.contains,这使得实现字典变得有点困难,我试过并失败了:(

然后我猜你没有错误地实现它。这是你应该做的:

  • 构建词典。
  • Put"第一项"作为键的价值"一个"
  • Put"第二项"作为键的价值"两个"
  • Put"第二项"作为关键" chaucer"
  • 的价值
  • 等...
  • 在您的当前循环内部,一旦您拥有loweredQuoteItem,就会循环遍历您的词典。
    • 如果字典包含innerLoopKey,请将Item.InsurerNameShort设置为innerLoopValue(并可选择中断)

确保在foreach (var Item in Stuff)循环之外构建此词典,以获得更好的性能。

答案 1 :(得分:2)

要简化您的方法,您可以使用内部动作。通过这种方式,您的方法将如下所示

        Action<string,string, Action> method = (source, search, action) => {if (source.Contains(search)) action(); };
        method(loweredQuoteItem, "one", () => Item.InsurerNameShort = "Item One");
        method(loweredQuoteItem, "two", () => Item.InsurerNameShort = "Item Two");
        method(loweredQuoteItem, "chaucer", () => Item.InsurerNameShort = "Item Chaucer");

如果没有lambda并且你的逻辑非常简单,那么你可以在不同的方法中移动你的IF语句:

    public void SetValueIfContains(string source, string search, string value, MyClass item)
    {
        if (source.Contains(search))
        {
            item.InsurerNameShort = value;
        }
    }

    public void YourFunction()
    {
        var loweredQuoteItem = quovteItem.Name.ToLower();
        SetValueIfContains(loweredQuoteItem, "one", "Item One", Item);
        SetValueIfContains(loweredQuoteItem, "two", "Item Two", Item);
        SetValueIfContains(loweredQuoteItem, "Chaucer", "Item chaucer", Item);
    }

如果IF语句中的逻辑很复杂,您可以定义ISrategy接口并为每种情况实施策略。这是更好的做法。