Я думал, что знаю все о IEnumerable<T>
, но я только что встретил случай, который не могу объяснить.Когда мы вызываем метод .Where linq для IEnumerable
, выполнение откладывается до перечисления объекта, не так ли?
Итак, как объяснить пример ниже:
public class CTest
{
public CTest(int amount)
{
Amount = amount;
}
public int Amount { get; set; }
public override string ToString()
{
return $"Amount:{Amount}";
}
public static IEnumerable<CTest> GenerateEnumerableTest()
{
var tab = new List<int> { 2, 5, 10, 12 };
return tab.Select(t => new CTest(t));
}
}
Пока ничего плохого!Но следующий тест дает мне неожиданный результат, хотя мои знания относительно IEnumerable<T>
и .Where
метода linq:
[TestMethod]
public void TestCSharp()
{
var tab = CTest.GenerateEnumerableTest();
foreach (var item in tab.Where(i => i.Amount > 6))
{
item.Amount = item.Amount * 2;
}
foreach (var t in tab)
{
var s = t.ToString();
Debug.Print(s);
}
}
Ни один элемент из вкладки не будет умножен на 2. Результат будет: Количество: 2Сумма: 5 Сумма: 10 Сумма: 12
Кто-нибудь может объяснить, почему после перечисления на вкладке я получаю исходное значение. Конечно, все работает нормально после вызова .ToList()
сразу после вызова GenerateEnumerableTest()
метода.