【问题标题】:Parsing command line arguments of different formats解析不同格式的命令行参数
【发布时间】:2020-01-15 06:06:06
【问题描述】:

我正在尝试将命令行参数转换为不同的格式。例如,如果我要获取特定用户,它会是GetUser=UserName,但我也有不需要等号的方法,例如GetAllUsers。现在我正在拆分=,但我不需要对所有命令都这样做。我尝试将其设置为条件,如果检测到=,它将分裂,否则它将仅将参数作为字符串,但我得到Cannot implicitly convert type 'string' to 'System.Collections.Generic.Dictionary<string, string>

代码:

 public static Dictionary<string, string> ParseArgs(string[] args)
        {
            Dictionary<string, string> results = new Dictionary<string, string>();
            foreach (string arg in args)
            {
                string[] parts = arg.Split('=');
                if (parts.Length > 1)
                {
                    results[parts[0]] = parts[1];
                    continue;
                }
                else
                {
                    results = Convert.ToString(arg);
                }

            }
            return results;
        }

【问题讨论】:

  • results = Convert.ToString(arg); 想想这条线在做什么,results 的类型是什么,以及为什么会出现问题。
  • 查看CommandLineParser 库。 Git在这里-github.com/commandlineparser/commandline。它使解析命令行参数变得更加简单。您当前面临的问题是尝试将字符串分配给字典类型。那显然行不通。您可能可以使用results.Add(arg, arg) 使键与值相同,但这对我来说简直是意大利面条。你最好使用正确的工具来完成这项工作。
  • 您可以将if/else 替换为results[parts[0]] = parts.Length &gt; 1 ? parts[1] : "";
  • 效果很好@RufusL,谢谢

标签: c# command-line-arguments


【解决方案1】:

您正在尝试将字符串分配给字典对象。如果你想要一个集合(比如 Dictionary),那么你应该像这样使用 Add 方法:

    foreach (string arg in args)
    {
        string[] parts = arg.Split('=');
        if (parts.Length > 1)
        {
            //results[parts[0]] = parts[1];
            results.Add(parts[0], parts[1]);
            continue;
        }
        else
        {
            results.Add("GetUser", arg);
        }

    }

我已强制将其设置为“GetUser”作为此处的值,但您实际上可能想要一些不同的东西。您的字典正在使用键值对,您会说 results["GetUser"] 以返回“GetUser”的字符串。您还可以使用TryGetValue 来验证是否确实提供了 GetUser。

此外,如果您只想返回 GetUser 之后的字符串(例如用户名),那么您可以将结果更改为字符串,然后直接分配它并跳过字典的整个使用,这对于您的示例来说似乎有点过分(不过,也许您的实际项目要复杂得多)。

【讨论】:

  • 另外,如果您想以原始方式添加它,您只需要将 else 语句更改为我们 results["GetUser"] = arg;
【解决方案2】:

在 else 部分,您尝试通过语句 results = Convert.ToString(arg); 将字符串分配给字典

所以,请将 else 部分更改为如下所示:

public static Dictionary<string, string> ParseArgs(string[] args)
{
     Dictionary<string, string> results = new Dictionary<string, string>();
     foreach (string arg in args)
     {
          string[] parts = arg.Split('=');
          if (parts.Length > 1)
          {
               results[parts[0]] = parts[1];
               // continue; no need to use continue, as there are no more statements after this if-else, loop will anyway continue. but please uncomment if you have any in your actual code.
          }
          else
          {
               results[arg] = arg; // assuming arg string in args won't repeat, meaning its unique. Otherwise please use ContaineKey if condition before adding or over-writing.
           }
     }
     return results;
}

【讨论】:

  • "arg" 已经是一个字符串。请参阅上面的“foreach (string arg in args)”部分。此外,将值分配给 Dictionary 中的 value 和 key 可能需要遍历 Dictionary,虽然这样做会在某种程度上破坏首先使用 Dictionary 类型的全部意义。 (并不是说 OP 的示例也是一个很好的用例。)
  • @JoshMaag 感谢您指出 ToString 转换。我同意,我会更新帖子。它只是我这边的复制+粘贴错误。对于第二部分,由于我不知道密钥使用什么,我只使用了 OP 可以用对他/她有意义的任何内容替换的相同字符串。我只是试图消除他得到的错误。
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 2012-01-26
  • 2011-08-15
  • 1970-01-01
相关资源
最近更新 更多