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

Posted

技术标签:

【中文标题】TakeLast 在 .net core 3.1 中无法按预期工作【英文标题】:TakeLast not working as expected in .net core 3.1 【发布时间】:2020-11-14 22:31:44 【问题描述】:

我在 .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 中给出不同的值?

【问题讨论】:

你期待什么结果? 这个问题很清楚。它在 2.2 中有效,但在 3.1 中无效 我不会说,这是您预期的结果。但是,您可以检查 TakeLastEnumerableFactory&lt;TSource&gt; 并检查会发生什么 我的问题很简单。为什么它在 .net core 2.2 和 3.1 中给出不同的值 2天前作为bug输入:github.com/dotnet/runtime/issues/39864显然是因为github.com/dotnet/corefx/pull/36051 【参考方案1】:

这里有一些观察:

    在初次调用 TakeLast(5) 后调用 ToList() 可解决此问题。 在arr.AddRange 之后调用 arr.TakeLast(5) 也可以解决此问题。

我认为这是与TakeLast. 返回的迭代器相关的错误

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

非常奇怪的行为,xD。

【讨论】:

是的,这是一个错误。

以上是关于TakeLast 在 .net core 3.1 中无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章