C# 如何以字典的形式从控制台应用程序获取命名参数<;字符串,字符串>;?
我有一个名为MyTool.exe的控制台应用程序 收集传递到此控制台应用程序的命名参数,然后将它们放入C# 如何以字典的形式从控制台应用程序获取命名参数<;字符串,字符串>;?,c#,.net,string,parsing,console-application,C#,.net,String,Parsing,Console Application,我有一个名为MyTool.exe的控制台应用程序 收集传递到此控制台应用程序的命名参数,然后将它们放入Dictionarty()中的最简单方法是什么?该字典将参数名称作为键,值作为参数 例如: MyTool foo=123432 bar=Alora barFoo=45.9 我应该能够获得一本字典,它将是: MyArguments["foo"]=123432 MyArguments["bar"]="Alora" MyArguments["barFoo"]="45.9" 以下是最简单的方法:
Dictionarty()
中的最简单方法是什么?该字典将参数名称作为键,值作为参数
例如:
MyTool foo=123432 bar=Alora barFoo=45.9
我应该能够获得一本字典,它将是:
MyArguments["foo"]=123432
MyArguments["bar"]="Alora"
MyArguments["barFoo"]="45.9"
以下是最简单的方法:
static void Main(string[] args)
{
var arguments = new Dictionary<string, string>();
foreach (string argument in args)
{
string[] splitted = argument.Split('=');
if (splitted.Length == 2)
{
arguments[splitted[0]] = splitted[1];
}
}
}
static void Main(字符串[]args)
{
var参数=新字典();
foreach(参数中的字符串参数)
{
string[]splitted=argument.Split('=');
如果(拆分的长度==2)
{
参数[splitted[0]]=splitted[1];
}
}
}
请注意:
- 参数名称区分大小写
- 多次提供相同的参数名称不会产生错误
- 不允许有空格
- 一=必须使用符号
- 我不明白为什么这个代码不好?霍瓦
var arguments = new Dictionary<string, string>();
foreach (var item in Environment.GetCommandLineArgs())
{
try
{
var parts = item.Split('=');
arguments.Add(parts[0], parts[1]);
}
catch (Exception ex)
{
// your error handling here....
}
var arguments=newdictionary();
foreach(Environment.GetCommandLineArgs()中的变量项)
{
尝试
{
var parts=item.Split('=');
添加(部分[0],部分[1]);
}
捕获(例外情况除外)
{
//您的错误处理在这里。。。。
}
使用此Nuget软件包
- V1.9.x-(CodePlex-即将消失且过时)
- V2+-(持续支持)
// Define a class to receive parsed values
class Options {
[Option('r', "read", Required = true,
HelpText = "Input file to be processed.")]
public string InputFile { get; set; }
[Option('v', "verbose", DefaultValue = true,
HelpText = "Prints all messages to standard output.")]
public bool Verbose { get; set; }
[ParserState]
public IParserState LastParserState { get; set; }
[HelpOption]
public string GetUsage() {
return HelpText.AutoBuild(this,
(HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current));
}
}
// Consume them
static void Main(string[] args) {
var options = new Options();
if (CommandLine.Parser.Default.ParseArguments(args, options)) {
// Values are available here
if (options.Verbose) Console.WriteLine("Filename: {0}", options.InputFile);
}
}
如果参数值中有“=”,则更安全的选项是:
private static Dictionary<string, string> ResolveArguments(string[] args)
{
if (args == null)
return null;
if (args.Length > 0)
{
var arguments = new Dictionary<string, string>();
foreach (string argument in args)
{
int idx = argument.IndexOf('=');
if (idx > 0)
arguments[argument.Substring(0, idx)] = argument.Substring(idx+1);
}
return arguments;
}
return null;
}
私有静态字典解析参数(字符串[]args)
{
如果(args==null)
返回null;
如果(args.Length>0)
{
var参数=新字典();
foreach(参数中的字符串参数)
{
int idx=argument.IndexOf('=');
如果(idx>0)
参数[argument.Substring(0,idx)]=参数.Substring(idx+1);
}
返回参数;
}
返回null;
}
难道你不能使用更标准的格式,从而让你的应用程序更好地与其他应用程序进行互操作吗?看看重写密钥是一种致命的“无声错误”.该程序不会抱怨,也不会曲解用户指定的内容。在大多数情况下,这并不重要。霍瓦:这就是一个例子。这也是我的方法。我喜欢使用“纯”的概念C#和.NET而不是第三方LIB,如果可行的话.2.0.*-测试版似乎改变了一些东西:-包括一个不同的选项布局。@WernerCD猜测我们需要在这个答案发布后更新它。感谢您指出。在我看来,您应该使用“if(args.Length>=1)”或“if(args.Length>=1)”而不是“if(args.Length>1)”(args.Length>0)”。如果只有1个参数,代码将返回null。为什么要将Environment.GetCommandLineArgs而不仅仅是args?那么,代码示例与运行它的位置无关,只需将它粘贴到某个位置,它就会运行。