字典对象中的键值重复且设计错误

时间:2011-03-04 21:48:34

标签: c# .net generics dictionary

我想用字典对象和提供的命令行参数做一些'动态'的事情。命令行参数是布尔值,然后我可以调用方法,如果它们中的任何一个为真。所以......

public class CommandLineArguments
{
    public bool AddSection1 { get; set; }
    public bool AddSection2 { get; set; }
    public bool Addsection3 { get; set; }        
}

class RunSomeActions
{
    private Dictionary<bool, Action> methodList = new Dictionary<bool, Action>();

    public RunSomeActions()
    {
        // create the switches as if from a command line
        CommandLineArguments parameters = new CommandLineArguments();
        parameters.AddSection1 = true;
        parameters.AddSection2 = false;
        parameters.Addsection3 = true;

        // setup the methods for the switches
        methodList.Add(parameters.AddSection1, this.Section1);
        methodList.Add(parameters.AddSection2, this.Section2);
        methodList.Add(parameters.Addsection3, this.Section3);

        foreach (var entry in methodList)
        {
            // if the switch is on
            // call the method
            if (entry.Key)
                methodList[entry.Key]();
        }


    }

    private void Section1()
    { 
        // add specific entries into a file
    }

    private void Section2()
    { 
        // perform analysis on a file
    }

    private void Section3()
    { 
        // delete everything and start again
    }

}

如果你只有两个真值和假值,那么效果很好,所以它真的不太好。我对这种方法所做的就是不必手动解析参数,然后构建一个Action列表。有没有办法可以挽救这种设计?

2 个答案:

答案 0 :(得分:3)

由于您实际上并未使用字典进行查找,而只是用于存储和迭代,而不是使用Dictionary<K,V>,因此您只需使用List<KeyValuePair<K,V>>即可。

与代码角度的主要区别在于:添加到:

methodList.Add(new KeyValuePair<bool, Action>(parameters.AddSection1, this.Section1));

然后,当您使用时,切换到:

foreach (var entry in methodList)
{
    // if the switch is on
    // call the method
    if (entry.Key)
        entry.Value(); // Execute "value" directly
}

话虽如此,您可以更进一步,可能直接存储List<Action>。仅将操作添加到条件为true的列表中,然后全部执行。

答案 1 :(得分:0)

我建议创建一个结构。

struct MethodListItem
{
    bool IsActive;
    Action Action;
}

然后将methodList声明为(惊讶)List<MethodListItem>,并添加如下:

methodList.Add(new MethodListItem { IsActive = parameters.AddSection1, Action = this.Section1});
methodList.Add(new MethodListItem { IsActive = parameters.AddSection2, Action = this.Section2});
methodList.Add(new MethodListItem { IsActive = parameters.Addsection3, Action = this.Section3});

然后循环体变得更具可读性:

foreach (var entry in methodList)
{
    // if the switch is on
    // call the method
    if (entry.IsActive) entry.Action();
}