TakeLast 在 .net core 3.1 中没有按预期工作
TakeLast not working as expected in .net core 3.1
我在 .net core 3.1 控制台应用程序中编写了以下代码。它没有按预期工作。
var arr = new List<int>(Enumerable.Range(1, 10));
var last5 = arr.TakeLast(5);
foreach (var i in last5)
Console.WriteLine(i); //writing 6 7 8 9 10
arr.AddRange(new[] { 11, 12, 13, 14, 15 });
foreach (var i in last5)
Console.WriteLine(i); //writing 6 7 8 9 10 11
它按预期工作 (6 7 8 9 10 11 12 13 14 15) 如果我将项目定位到 .net core 2.2。
我暂时用for
循环解决了这个问题
为什么在 .net core 2.2 和 3.1 中给出不同的值?
这里有几点观察:
- 在初始调用
TakeLast(5)
后调用 ToList()
修复了问题。
- 在
arr.AddRange
之后调用 arr.TakeLast(5) 也解决了这个问题。
我认为这是一个与 TakeLast.
返回的迭代器相关的错误
在一种情况下(版本 2.2),迭代器位置在调用 AddRange
方法后未重置。在另一个(3.1)中,它正在重置数组开始。
非常奇怪的行为,xD。
我在 .net core 3.1 控制台应用程序中编写了以下代码。它没有按预期工作。
var arr = new List<int>(Enumerable.Range(1, 10));
var last5 = arr.TakeLast(5);
foreach (var i in last5)
Console.WriteLine(i); //writing 6 7 8 9 10
arr.AddRange(new[] { 11, 12, 13, 14, 15 });
foreach (var i in last5)
Console.WriteLine(i); //writing 6 7 8 9 10 11
它按预期工作 (6 7 8 9 10 11 12 13 14 15) 如果我将项目定位到 .net core 2.2。
我暂时用for
循环解决了这个问题
为什么在 .net core 2.2 和 3.1 中给出不同的值?
这里有几点观察:
- 在初始调用
TakeLast(5)
后调用ToList()
修复了问题。 - 在
arr.AddRange
之后调用 arr.TakeLast(5) 也解决了这个问题。
我认为这是一个与 TakeLast.
在一种情况下(版本 2.2),迭代器位置在调用 AddRange
方法后未重置。在另一个(3.1)中,它正在重置数组开始。
非常奇怪的行为,xD。