【问题标题】:dictionary and string split in server服务器中的字典和字符串拆分
【发布时间】:2019-03-05 15:22:46
【问题描述】:

您好,我的字典初始化有问题。我必须声明一个字典并填充我从客户端接收的(用户名)和(位置)。当它找到用户名时,它应该发回位置,如果不是,它应该发回“未找到条目”,如果位置已更新,那么它应该说“确定”。现在我遇到了一个超出范围的错误,有人可以帮我解决它。谢谢。

protected static Dictionary<string, string> dict = new Dictionary<string, string>();

static void doRequest(NetworkStream socketStream)
{
    try
    {
        StreamWriter sw = new StreamWriter(socketStream);
        StreamReader sr = new StreamReader(socketStream);

        String line = sr.ReadLine();   
        Console.WriteLine("Respond recived " + line);

        String[] sections = line.Split(new char[] { ' ' }, 2);

        dict.TryGetValue(sections[0],out sections[1]);

        if(sections[0].Length>1)
        {
            sw.WriteLine(sections[1]);
            sw.Flush();
        }
        else
        {
            sw.WriteLine("no entries found");
            sw.Flush();
        }
        if(sections[1].Length>2)
        {
            sw.WriteLine("OK");
            sw.Flush();
        }

    catch (Exception e)
    {
        Console.WriteLine(e);

    }

}

【问题讨论】:

  • line 包含什么?您是否使用了调试器并查看其值是多少?我敢打赌它不包含空格,使 sections 成为一个只有一个元素的数组。
  • 您确定错误是由字典而不是数组引发的吗?发布完整的例外。我怀疑它的调用堆栈会显示错误是由sections 数组引发的
  • 无论如何,这段代码不会初始化字典,它会查找值。它不会向它添加任何值
  • 如果你把它分开,这会更容易处理。您尝试测试的逻辑只涉及字符串。但为了测试它,您需要创建一个NetworkStream。这使得测试变得更加困难。相反,只需编写代码来处理字符串以外的任何内容。然后您可以轻松地对其进行测试并解决错误。最后,编写一个处理流的类,从流中读取字符串,调用另一个类,然后将结果传递给另一个流。简短版 - 不要将读取和写入流与您的字符串逻辑混为一谈。

标签: c# string dictionary methods split


【解决方案1】:

这两条线可能是问题所在:

String[] sections = line.Split(new char[] { ' ' }, 2);
dict.TryGetValue(sections[0],out sections[1]);

如果line.Split 返回 1 个字符串(假设该行没有任何空格),则 section[1](数组中的第二个字符串)将不存在,并且您会收到 IndexOutOfRangeException。

我建议对 TryGet 使用单独的变量

dict.TryGetValue(sections[0],var out foundValue);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多