При использовании LINQ для определения перечислимой коллекции, либо с помощью методов расширения LINQ или с помощью операторов запросов, приложение фактически не строить коллекции в то время, что расширение LINQ метод выполнен; сбор перечисляется только тогда, когда вы перебираете его. Это означает, что данные в исходной коллекции могут изменяться между выполнением запроса LINQ и получением данных, которые идентифицирует запрос; вы всегда будете получать самые последние данные .Linq и отложенная оценка
Microsoft Visual C# 2013 шаг за шагом, написанная Джоном Sharp
Я написал следующий код:
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<int> res = numbers.FindAll(a => a > 0).Select(b => b).ToList();
numbers.Add(99);
foreach (int item in res)
Console.Write(item + ", ");
В результате приведенного выше кода показан ниже:
1, 2, 3, 4, 5,
Почему так происходит? Я знаю о Func
, Action
и Predicate
, но я не могу понять, что здесь происходит. Исходя из вышеприведенного определения, код не является рациональным.
Попробуйте удалить 'ToList()' в конце –
@MatiasCicero Я пробовал, но не имел никакого эффекта. – Media
'ToList()' создает * новый * список ('res') и копирует все элементы, но вы добавляете в * old * one (' numbers') –