2013-07-02 58 views
1

我是NDesk.Options庫的新手。找不到解析簡單項目列表的最簡單方法。如何使用C#中的NDesk選項解析項目的簡單列表#

例子: PROG --items =物品1 ITEM2項目3 (我想使用的代碼列表中的項目)

它應該支持報價以及我想用項列表文件的列表或目錄名稱。

prog --items =「c:\ a \ b \ c.txt」「c:\ prog files \ d.txt」 prog --dirs =「c:\ prog files \」「d:\ x \ y \ dirname中的空格「

回答

3

您可以使用」<>「輸入,表示沒有標誌與輸入關聯。由於這些選項是從左到右讀取的,因此您可以在遇到開始標誌時設置'currentParameter'標誌,並假定任何後續沒有標誌的輸入都是列表的一部分。下面是一個例子,我們可以指定一個List作爲輸入文件,而一個Dictionary(參數)是一個鍵值對列表。其他變化當然也可以使用。

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); 
1

接受單個參數的值列表的替代方法是多次接受相同的參數。例如,

PROG --file = 「C:\ A \ B \ c.txt」 --file = 「C:\ PROG文件\ 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); 

恕我直言,這段代碼更易於閱讀和維護。

相關問題