LINQ与匿名类型的区别(在VB.NET中)

OrE*_*lse 8 .net linq vb.net linq-to-objects distinct

假设List下面引用的内容包含2个元素:

Dim Countries = From c In List _
                Select New With { .Country = c.Country, .CountryID = c.CountryID }
Run Code Online (Sandbox Code Playgroud)

上面的代码返回

.Country=Spain .CountryID = 1
.Country=Spain .CountryID = 1
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得不同的价值观?该Countries查询应该只包含

.Country=Spain .CountryID = 1
Run Code Online (Sandbox Code Playgroud)

Khe*_*pri 35

我只能假设你已经死于使用匿名类型,因为Alex Peck给出的答案是正确的.(我赞成它).

但是,这归结为VB.NET与C#编译器的讨论.

在VB.NET中,当遇到匿名类型时,只有那些声明为键属性的属性才能用于比较.因此,在没有密钥的VB.NET中,当您尝试进行明确的比较时,不会发生任何事情.

在这里阅读所有相关信息.

首先,回答你的问题,这适用匿名类型:

Dim Countries = From c In List Select New With {Key c.CountryId, c.Country} Distinct.ToList
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这就是为什么freedompeace的答案不起作用的原因.

C#然而编译器有点不同.

遇到匿名类型并且需要进行比较操作时,c#编译器会覆盖Equals和GetHashCode.它将迭代匿名类型的所有公共属性,以计算对象的哈希代码以测试相等性.

你可以在这里阅读更多相关信息.

希望这能回答你的问题.


Ale*_*eck 5

Dim distinctCountries = Countries.Distinct()
Run Code Online (Sandbox Code Playgroud)

当我停在调试器的最后一行时,这对我有用:

Imports System.Text

<TestClass()>
Public Class UnitTest1

    Class Test
        Public Country As String
        Public CountryID As Integer
    End Class

    <TestMethod()>
    Public Sub TestMethod1()

        Dim List(1) As Test
        List(0) = New Test With {.Country = "Spain", .CountryID = 1}
        List(1) = New Test With {.Country = "Spain", .CountryID = 1}

        Dim Countries = From c In List Select c.Country, c.CountryID

        Dim distinctCountries = Countries.Distinct()
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)