我有以下
Dim query = From city In myCountry.Cities
From street In city.Streets
Select New StreetInfo With {.Name = street.Name, .Index = street.Index}
Distinct
现在。我建议,如果我有多个相同的街道(具有相同的
Name
和 Index
),则StreetInfo列表将包含所有重复的...如何为生成的StreetInfo值集合指定真正不同的值?
假设
StreetInfo
类的定义如下:Public Class StreetInfo
Public Property Name As String
Public Property Index As Integer
End Class
最佳答案
您可以在GetHashCode
中覆盖Equals
和StreetInfo
,但是考虑到它的可变性,以其现有形式并不太好。 (您可以创建两个实例,它们等于一分钟,然后不等于下一分钟。这通常会带来令人困惑的调试体验。)或者,可以使用匿名类型,确保使用只读的“键”属性:
Dim query = From city In myCountry.Cities
From street In city.Streets
Select New With { Key .Name = street.Name, Key .Index = street.Index}
Distinct
此处,相等性和哈希码将由编译器自动提供。这等效于:
Dim query = From city In myCountry.Cities
From street In city.Streets
Select street.Name, street.Index
Distinct
有关更多信息,请参见MSDN article on anonymous types。
如果以后肯定需要
StreetInfo
值并且不想使其不可变,则可以在以后添加另一个投影(选择)。我不知道是否可以在单个查询中的Distinct子句之后附加另一个Select子句,但是您可以使用第二个表达式:Dim query = From city In myCountry.Cities
From street In city.Streets
Select street.Name, street.Index
Distinct
Dim query2 = From street in query
Select New StreetInfo With {.Name = street.Name, _
.Index = street.Index}
关于.net - 在LINQ中什么是Distinct?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7677428/