代码之家  ›  专栏  ›  技术社区  ›  Vivek Nuna Chetan sabhaya

TakeLast在.net core 3.1中未按预期工作

  •  1
  • Vivek Nuna Chetan sabhaya  · 技术社区  · 4 年前

    我在.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
    

    如果我将项目目标定在.net core 2.2中,它将按预期工作(6 7 8 9 10 11 12 13 14 15)。

    我用过 for 暂时循环以解决问题。

    为什么它在.net core 2.2和3.1中给出了不同的值?

    1 回复  |  直到 4 年前
        1
  •  0
  •   Arsen Khachaturyan    4 年前

    这里有一些观察结果:

    1. 打电话 ToList() 首次致电后 TakeLast(5) 修复问题。
    2. 调用arr.TakeLast(5)之后 arr.AddRange 也修复了这个问题。

    我假设这是一个与返回的迭代器相关的bug TakeLast.

    在一种情况下(版本2.2),迭代器位置在调用后没有重置 AddRange 方法。在另一个(3.1)中,它重置了数组开始。

    非常奇怪的行为,xD。