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<TSource>
并检查会发生什么
我的问题很简单。为什么它在 .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 中无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章