Это классическая LINQ гоча.
Переменная messages
содержит ссылку на IEnumerable<someAnonymousType>
. Ошибка, которую вы совершаете, заключается в том, что после присвоения messages
все Descendents
были перечислены и набор someAnonymousType
был построен.
На самом деле ничего не произошло на этом этапе. Только когда вы начинаете перечислять набор с помощью foreach, перечисляются Descendents
и создаются анонимные типы. Даже в тот момент, когда весь набор Descendents
не был перечислен, фактически только до первого элемента, который соответствует условию условия where
, тогда одновременно создается только одна проекция (результат выбора), как foreach проходит через.
Следовательно, сообщения, которые вы добавляете, также включаются в перечисление, и потому что это вызывает другие сообщения, которые вы заканчиваете в бесконечном цикле, или, по крайней мере, ошибка с жалобой на вашу попытку изменить перечисляемую коллекцию.
Если вы хотите убедиться, что список перечисляемых элементов фиксирован, перед тем, как прекратить цикл, добавьте ToList()
к запросу, это создаст List<T>
.
var messages = (from message in XcurrentMsg.Descendants("message")
where DateTime.Parse(message.Attribute("timestamp").Value).CompareTo(DateTime.Parse(MessageCache.Last_Cached())) > 0
select new
{
ip = message.Attribute("ip").Value,
timestamp = message.Attribute("timestamp").Value,
text = message.Value,
}).ToList();
Обратите внимание, что нет необходимости проверять messages
на ноль в любом случае, это не будет ноль, это может быть пустое перечисление или список.