如何使用C#中的NDesk选项解析简单的项目列表

本文关键字:简单 项目 列表 选项 何使用 中的 NDesk | 更新日期: 2023-09-27 18:20:37

我是NDesk.Options库的新手。无法找到解析简单项目列表的最简单方法。

示例:prog--项目=项目1项目2项目3(我想使用一个列出代码中的项目)

它应该支持引用,因为我想使用项目列表作为文件或目录名称的列表。

prog--items="c:''a''b''c.txt"c:''prog files''d.txt"prog--dirs="c:''prog files''"d:''x''y''space in dirname"

如何使用C#中的NDesk选项解析简单的项目列表

您可以使用"<>"输入,这表示没有与该输入关联的标志。由于选项是从左到右读取的,因此当遇到起始标志时,可以设置"currentParameter"标志,并假设任何没有标志的后续输入都是列表的一部分。这里有一个例子,我们可以指定一个List作为输入Files,以及一个Dictionary(Parameters),它们是键值对的列表。当然,也可以使用其他变体。

OptionSet options = new OptionSet()
        {
            {"f|file", "a list of files" , v => {
                currentParameter = "f";
            }},
            {"p", @"Parameter values to use for variable resolution in the xml - use the form 'Name=Value'.  a ':' or ';' may be used in place of the equals sign", v => {
                currentParameter = "p";
            }},
            { "<>", v => {
                switch(currentParameter) {
                    case "p":
                        string[] items = v.Split(new[]{'=', ':', ';'}, 2);
                        Parameters.Add(items[0], items[1]);
                        break;
                    case "f":
                        Files.Add(Path.Combine(Environment.CurrentDirectory, v));
                        break;
                }
            }}
        };
options.Parse(args);

接受单个参数的值列表的另一种选择是多次接受同一个参数。例如,

prog--file="c:''a''b''c.txt"--file="c:''prog files''d.txt"

在这种情况下,您的代码看起来像这样。

List<string> fileList = new List<string>();
OptionSet options = new OptionSet
{
    { "f|file", "File name. Repeat argument for each file.", v =>
        {
            fileList.Add(v);
        }
    }
};
options.Parse(args);

IMHO,此代码更易于阅读和维护。