我有一个返回员工职位列表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
}现在,方法可以返回多个字符串,所以employee可以成为example.Now的管理员和办公室主任我需要在第一个if和第一个else if中组合实现,我不想迷失在几个if -语句中,所以我想问您是否有更好的解决方案来解决这个问题。谢谢。
发布于 2015-12-15 08:50:57
您可以像这样定义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]();
}
}Edit:或者用作密钥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());发布于 2015-12-15 07:37:55
您在这里要使用的是一个strategy pattern。关于这一点的开创性文本是Gamma et的Gang Of Four一书。阿尔。如果您是设计模式的新手,Head First Design Patterns可能更容易访问。大量的网站和其他资源都在讨论这种模式。我强烈建议您查看它以及这些资源中讨论的其他设计模式。
发布于 2015-12-15 07:04:28
您可以使用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
}然后在最后检查人员所担任的职位,并应用所有相关的业务逻辑。
https://stackoverflow.com/questions/34278164
复制相似问题