我有一组这样的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";
}
答案 0 :(得分:4)
问题是它使用了string.contains,这使得实现字典变得有点困难,我试过并失败了:(
然后我猜你没有错误地实现它。这是你应该做的:
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
接口并为每种情况实施策略。这是更好的做法。