我有以下

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中覆盖EqualsStreetInfo,但是考虑到它的可变性,以其现有形式并不太好。 (您可以创建两个实例,它们等于一分钟,然后不等于下一分钟。这通常会带来令人困惑的调试体验。)或者,可以使用匿名类型,确保使用只读的“键”属性:

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/

10-11 21:40