我有返回员工职位列表List<string> listPositions
的方法。如果方法只返回一个字符串,那么基本逻辑将是这样的:
if (listPositions.Contains("Admin"))
{
// business logic 1,for example Console.WriteLine("I'm Admin");
}
else if (listPositions.Contains("OfficeDirector"))
{
//business logic 2
}
else if (listPositions.Contains("Regular") || listPositions.Contains("HumanResource"))
{
//business logic 3
}
现在,方法可以返回多个字符串,因此员工可以是Admin和Office Director。现在我需要在第一个if
和第一个else if
中组合实现,而我不需要&#39;我想在几个if语句中迷失,所以我问你是否有更优雅的解决方案来解决这个问题。
谢谢。
答案 0 :(得分:2)
您可以定义Dictionary<string, Action>
或Dictionary<string, Func>
Dictionary<string, Action> actions = new Dictionary<string, Action>
{
{ "Admin", new Action(() => Console.WriteLine("I'm Admin")) },
{ "OfficeDirector", new Action(() => Console.WriteLine("I'm OfficeDirector")) },
{ "Regular", new Action(() => Console.WriteLine("I'm Regular or HumanResource")) },
{ "HumanResource", new Action(() => Console.WriteLine("I'm Regular or HumanResource")) },
};
然后简单地调用逻辑:
foreach(var position in listPositions) {
if (actions.ContainsKey(position)) {
actions[position]();
}
}
编辑:
或者用作关键Predicate<string>
,更复杂的例子:
static Dictionary<Predicate<string>, Action> PredicatedActions = new Dictionary<Predicate<string>, Action>()
{
{ p => p == "Admin", new Action(() => Console.WriteLine("I'm Admin")) },
{ p => p == "OfficeDirector", new Action(() => Console.WriteLine("I'm OfficeDirector")) },
{ p => p == "HumanResource" || p == "Regular", new Action(() => Console.WriteLine("I'm Regular or HumanResource")) }
};
然后只需调用适用的操作:
var actionToExecute = listPositions.SelectMany(
position => PredicatedActions.Keys.Where(condition => condition(position)).Select(key => PredicatedActions[key])
).Distinct();
actionToExecute.ToList().ForEach(action => action());
答案 1 :(得分:1)
您想在这里使用的是strategy pattern。关于此的开创性文本是Gamma等人的Gang Of Four书。人。如果您不熟悉设计模式,Head First Design Patterns可能更容易访问。许多网站和其他资源都在讨论这种模式。我强烈建议您查看这些资源中讨论的其他设计模式。
答案 2 :(得分:0)
您可以使用switch语句,我发现它们更容易阅读。
或者,不是使用if / else,if / else,而是连续使用一堆if语句。然后这些可以捕获有效位置:
if (listPositions.Contains("Admin"))
{
// Concatenate some string or add to a list for final checking
}
if (listPositions.Contains("OfficeDirector"))
{
// Concatenate some string or add to a list for final checking
}
if (listPositions.Contains("Regular") || listPositions.Contains("HumanResource"))
{
// Concatenate some string or add to a list for final checking
}
然后在最后检查一下这个人持有的职位,并应用所有相关的业务逻辑。