Дублирование при работе с вложенными циклами foreach

Есть код, который производит поиск слов в матрице, содержащей в себе string значения. Есть класс Theme (тематика), описывающий тематику анализа, и коллекция слов, относящихся к данной тематике.

class Theme
{
    public string name;
    public List<string> words;

    public Theme(string name, List<string> words)
    {
        this.name = name;
        this.words = words;
    }
}

Например, я могу произвести поиск в матрице: 1) по тематике "Математические термины", к которым относятся слова "Аксиома", "Теорема". 2) по тематике "Досуг", к которой относятся слова "видеоигры", "сериалы".

Тематики сохранены в следующем формате:

 List<Theme> listOfThemesAndRelevantWords;

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

for (int i = 2; i < matrix.GetLength(1)-2; i++)
        {
            foreach(var theme in listOfThemesAndRelevantWords)
            {
                foreach (var word in theme.words)
                {
                    if (слово найдено)
                    {
                        results.Enqueue(new Interaction(
                            theme.name.ToString(),
                            matrix[0,i],
                            <....>
                            matrix[24, i]));
                    }
                }
            }
        }

Так, например, если я произведу поиск по каждой тематике отдельно и потом сложу результаты по каждой тематике то получу 10 строчек где встречается хотя бы одно из данных слов. Если я произвожу поиск сразу по двум тематикам, то результатов становится в двое больше и результаты дублируются => я проверяю по каждому слову дважды. Так не должно быть. Как исправить данный код? Как избежать дублирования?


Ответы (1 шт):

Автор решения: Igor
    for (int i = 2; i < matrix.GetLength(1)-2; i++)
    {
        bool found = false;
        foreach(var theme in listOfThemesAndRelevantWords)
        {
            foreach (var word in theme.words)
            {
                // поиск слов, сохранение результата
                // если нашли, назначить переменной found значение true
                if (found)
                  break;
            }
            if (found)
              break;
        }
    }
→ Ссылка