Построение строки перед продолжением в цикле foreach - PullRequest
0 голосов
/ 20 мая 2018

У меня есть некоторый код, используемый для установки текста всплывающей подсказки в моей программе.По сути, метод получает точку, соответствующую положению курсора, а все доступные подсказки под курсором объединяются и показываются пользователю в одной подсказке.

То, что я пытаюсь сделать, - это создать строку, содержащую весь текст из каждой подсказки под курсором, а затем установить текст подсказки с этой встроенной строкой.Моя проблема в том, что я хочу построить эту строку полностью, прежде чем продолжить в цикле 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, потому что мне нужно разрываться в конце после того, как подсказка установлена, чтобы подсказка отображалась правильно.

1 Ответ

0 голосов
/ 20 мая 2018

Я не совсем понимаю, почему следующий раздел не может быть просто перемещен за пределы цикла 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");
            }
        }
...