C# 在继续foreach循环之前构建字符串

C# 在继续foreach循环之前构建字符串,c#,winforms,foreach,tooltip,stringbuilder,C#,Winforms,Foreach,Tooltip,Stringbuilder,我有一些代码用于在程序中设置工具提示文本。基本上,方法被赋予一个与光标位置相对应的点,光标下的所有可用工具提示被合并并在一个工具提示中显示给用户 我要做的是构建一个字符串,其中包含光标下每个工具提示的所有文本,然后使用该构建字符串设置工具提示文本。我的问题是,我希望在继续foreach循环之前完全构建该字符串。请参见代码中的我的注释: public void Show(Point point) { bool bInOldRegion = RectangleHitTest(point, o

我有一些代码用于在程序中设置工具提示文本。基本上,方法被赋予一个与光标位置相对应的点,光标下的所有可用工具提示被合并并在一个工具提示中显示给用户

我要做的是构建一个字符串,其中包含光标下每个工具提示的所有文本,然后使用该构建字符串设置工具提示文本。我的问题是,我希望在继续foreach循环之前完全构建该字符串。请参见代码中的我的注释:

public void Show(Point point)
{
    bool bInOldRegion = RectangleHitTest(point, oldRegion);

    if (!bInOldRegion)
    {
        oldRegion = new Rectangle(0, 0, 0, 0);
        bool toolTipUsed = false;

        var sb = new System.Text.StringBuilder();

        foreach (DictionaryEntry entry in toolTipRegions)
        {
            var tte = (ToolTipEntry)entry.Value;
            Rectangle rect = tte.region;

            if (RectangleHitTest(point, rect))
            {
                sb.Append(tte.text + "\n");
            }

            // I want to finish looping over every entry value and 
            // building the final string before 
            // continuing with the "toolTip.SetToolTip" part below

                toolTip.SetToolTip(m_control, tte.text);
                toolTip.Active = true;
                oldRegion = rect;
                toolTipUsed = true;
                break;
        }

        if (!toolTipUsed)
        {
            toolTip.Active = false;
        }
    }
}

我需要将所有内容都保留在foreach循环中,因为我需要在设置工具提示后在末尾中断,以便正确显示工具提示。

我真的不明白为什么不能将以下部分移到foreach循环之外

toolTip.SetToolTip(m_control, tte.text);
toolTip.Active = true;
oldRegion = rect;
toolTipUsed = true;
break;
可能是因为这不是完整的源代码,可能会有复杂的问题

如果是这种情况,请尝试以下替代解决方案。其思想是将foreach转换为for循环,并让它运行“n+1”次,其中“n”是哈希表中的键数。在第n+1次迭代中,我们可以检查并运行您希望在最后运行的上述代码。我希望这对你有用,如果不行,请告诉我它的局限性,我们可以找到更好的解决方案

        ICollection keyCollection = toolTipRegions.Keys;
        string[] keys = new string[keyCollection.Count];
        keyCollection.CopyTo(keys, 0);
        for (int i = 0; i < keys.Length + 1; i++)
        {
            if (i == keys.Length + 1)
            {
                toolTip.SetToolTip(m_control, tte.text);
                toolTip.Active = true;
                oldRegion = rect;
                toolTipUsed = true;
                break;
            }

            var entry = toolTipRegions[keys[i]];
            var tte = (ToolTipEntry)entry.Value;
            Rectangle rect = tte.region;

            if (RectangleHitTest(point, rect))
            {
                sb.Append(tte.text + "\n");
            }
        }
ICollection keyCollection=toolTipRegions.Keys;
string[]keys=新字符串[keyCollection.Count];
keyCollection.CopyTo(键,0);
对于(int i=0;i
什么是“工具提示区域”?它是一本字典吗?或者HashSet?toolTipRegions是一个HybridDictionaryHi Mikaal,我无法在foreach循环之外提取代码的原因是,当没有break语句时,它会导致工具提示闪烁。为了使用break,我曾尝试将这段代码移动到它自己的循环中,但它没有预期的行为。感谢您的帮助,我将测试它并让您知道它是如何运行的