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 中无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

NET Core 3.1 MVC 授权/身份验证,带有在单独的 Net Core 3.1 Web Api 中从外部获取的令牌 (JWT)

Wcf 服务在 .NET Core 3.1 控制台应用程序中工作,但在 ASP.NET Core 3.1 Web API 中无法工作

将项目从 2.2 更新到 3.1(缺少程序集)或如何在 .NET Core 中使用 API POST 请求时,PostAsJsonAsync()在 .Net Core 3.1 中不起作用 [重复]

ASP.NET Core--.net core 3.1 部署到 IIS

如何在 .NET Core 3.0 SDK 上构建多目标 .NET 5 和 .NET Core 3.1

无法在 .net core 3.1 中注入依赖项