Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以字典的形式从控制台应用程序获取命名参数<;字符串,字符串>;?_C#_.net_String_Parsing_Console Application - Fatal编程技术网

C# 如何以字典的形式从控制台应用程序获取命名参数<;字符串,字符串>;?

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" 以下是最简单的方法:

我有一个名为MyTool.exe的控制台应用程序

收集传递到此控制台应用程序的命名参数,然后将它们放入
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?那么,代码示例与运行它的位置无关,只需将它粘贴到某个位置,它就会运行。