gpt4 book ai didi

.net - IEnumerable.Min() 返回带有通用对象的奇怪结果

转载 作者:行者123 更新时间:2023-12-01 05:50:52 26 4
gpt4 key购买 nike

如果我有一个对象列表(例如 List(Of Foo) )并且我想获得列表元素中特定属性的最小值,我可以使用类似的方法:

listOfFoo.Min(Function(i) i.Id)

没有问题。现在,如果列表恰好为空,则上述代码将不起作用。所以,我使用类似的东西:
listOfFoo.DefaultIfEmpty().Min(Function(i) i?.Id).GetValueOrDefault()

这也很好用 直到列表变成通用对象列表 然后它开始返回非常奇怪的结果。

重现问题的代码:
Class Foo
Public Property Id As Integer
End Class

Class Bar
Public Property Id As Integer
End Class

Function GetMin(list As List(Of Foo)) As Integer
Return list.DefaultIfEmpty().Min(Function(i) i?.Id).GetValueOrDefault()
End Function

Function GetMin(Of T As Bar)(list As List(Of T)) As Integer
Return list.DefaultIfEmpty().Min(Function(i) i?.Id).GetValueOrDefault()
End Function

Sub Main()
Dim fooList As New List(Of Foo) From {New Foo() With {.Id = 2}, New Foo() With {.Id = 3}}
Dim min = GetMin(fooList)
Console.WriteLine(min) ' 2 --> Great!

Dim barList As New List(Of Bar) From {New Bar() With {.Id = 2}, New Bar() With {.Id = 3}}
Dim min2 = GetMin(Of Bar)(barList)
Console.WriteLine(min2) ' 12 --> Huh?!!!!

Console.ReadLine()
End Sub

如评论所示,第二个列表返回 12即使它与第一个具有相同的值。此外,您会注意到返回的值不是随机的;它随着类的属性而变化。例如,如果我将另一个字符串属性添加到 Bar ,它返回 606600而不是 12 !

有没有人对此有解释?还是我做错了什么?

更新:我认为这可能是 VB.NET 中的一个错误,因为我只是尝试在 C# 中做同样的事情并且它返回了正确的值。 Here's the C# code如果有人想看看。我对两者都使用了 .NET 4.5.2,但我也在 .NET 4.6.1 上使用 VB 进行了测试,但它仍然无法正常工作。

更新 #2:

我正在使用 VS2015。当我切换到 VS2017(相同的 .NET 版本)时,问题似乎消失了。

最佳答案

正如我在问题更新中提到的,这似乎可以在特定版本的 Visual Studio 上生成(在 VS2015 上生成,但不在 2017 上生成),所以我认为这是 VS2015 中使用的 VB 编译器中的一个错误。

不幸的是,我目前无法将此项目升级到 VS2017,因此作为一种解决方法,我将替换此行:

min = listOfFoo.DefaultIfEmpty().Min(Function(i) i?.Id).GetValueOrDefault()

和:
min = If(listOfFoo.Count = 0), 0, listOfFoo.Min(Function(i) i.id)

..虽然在可读性方面我更喜欢前者,但它做同样的事情。

关于.net - IEnumerable.Min() 返回带有通用对象的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54391384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com