【问题标题】:Method not returning expected value方法未返回预期值
【发布时间】:2017-10-21 07:17:06
【问题描述】:

我不知道下面的代码有什么问题。我的回报不起作用。 我在代码中注释了更多细节。

item 是文本文件中的一行。一个例子是“Port; 2302;”

    portTextBox.Text = Config_check(item, "Port", 1);
    private string Config_check(string item, string contains, int i)
    {
        string part = "defualt";
        if (item.Contains(contains))
        {
            MatchCollection Parts = Regex.Matches(item, @"(?i); *(.+?);(?-i)", RegexOptions.Singleline);
            foreach (Match m in Parts)
            {
                part = m.Groups[i].Value; // sets part to '2302'
                MessageBox.Show(part); // Shows '2302', Does open message box
                return part; // Dosnt work
            }
            MessageBox.Show(part); // Shows 'Defualt' why?!?!
            return part; // Dosnt work
        }
        MessageBox.Show(part); // Shows 'Defualt' why?!?!
        return part; // returns 'Defualt'
    }

【问题讨论】:

  • 你调试通过了吗?您的输入和正则表达式可能没有执行,并且与您的预期不同。
  • 也就是说,您的 cmets 关于正在发生的事情表明正则表达式与 item 不匹配。
  • “item”的值是多少,为什么期望正则表达式匹配它?
  • Item 是文本文档中的一行,例如,在该文本文档中,如果该行包含端口搜索两者之间的任何内容,它会显示Port; 2302;; foreach 中的消息框显示了正确的值,所以我知道该位有效。它的回报不起作用。
  • 嗯,第二个和第三个returns 都给你“默认”,因为part 从未设置为其他任何值。

标签: c# methods return


【解决方案1】:

可能您的问题是循环内的 return 语句。如果您从您的方法返回,您的方法的其余部分将不再执行。所以可能你所要做的就是删除内部返回:

portTextBox.Text = Config_check(item, "Port", 1);
private string Config_check(string item, string contains, int i)
{
    string part = "defualt";
    if (item.Contains(contains))
    {
        MatchCollection Parts = Regex.Matches(item, @"(?i); *(.+?);(?-i)", RegexOptions.Singleline);
        foreach (Match m in Parts)
        {
            part = m.Groups[i].Value;
            MessageBox.Show(part);
        }
        MessageBox.Show(part);
    }
    MessageBox.Show(part);
    return part;
}

但是,由于我不知道您的其余代码,它可能仍然无法正常工作。

这实际上似乎不是一个很好的尝试,因为您在 foreach 循环中覆盖了part,因此唯一的值(将在part 中)将是被保存的值在Parts的最后一场比赛中。


编辑

如果你不想要 foreach 循环,你可以简单地取最后一项:

portTextBox.Text = Config_check(item, "Port", 1);
private string Config_check(string item, string contains, int i)
{
    string part = "defualt";
    if (item.Contains(contains))
    {
        MatchCollection Parts = Regex.Matches(item, @"(?i); *(.+?);(?-i)", RegexOptions.Singleline);
        part = Parts.OfType<Match>().LastOrDefault() ?? "default";
        MessageBox.Show(part);
    }
    MessageBox.Show(part);
    return part;
}

您可以(显然)删除 foreach 循环内的消息框。

【讨论】:

  • 有没有办法摆脱 foreach 循环?我不需要它我只想要 Groups[1] 反正
  • 可以去掉 if 语句中的 MessageBox.Show(part) 语句。
  • @RuardvanElburg 因为它可能只是出于调试原因而存在,我不会删除它。
  • 嗯,其实不是。显示消息框后留下的原始代码。但在这种情况下(如果 item 包含),您会看到两次相同的消息。
  • @RuardvanElburg 我在回答中提到过。
猜你喜欢
  • 1970-01-01
  • 2020-02-08
  • 2013-09-04
  • 2016-02-13
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多