Это потому, что _listTopN
удерживает отложенный запрос, лениво выполняемый при его цикле.
Другими словами, var _listTopN = ...
не оценивает запрос, а возвращает рецепт того, какчтобы оценить его при необходимости.
Поскольку вы очищаете исходный источник перед его оценкой, он «изменится», то есть вернет нечто иное, чем вы хотели / ожидали.
Простое исправление состоит в форсировании оценки, поэтому сделайте следующее:
var _listTopN = matches.OrderByDescending(s => s.Value)
.Take(Settings.requiredMatch).ToArray();
^--------^ <-- add this
Это оценивает ваш запрос и сохраняет результат в виде массива, который не изменится, и теперь вы можете безопасно очистить исходный источник данных.