好了伙计们。第一次在这里发问。我正在尝试演示LINQ的几个功能,但遇到了一些问题。以下查询未按预期执行:
Dim peopleByAgeAndName = _
From p In (New PeopleRepository).GetAll
Group By key = New With {p.Age, p.Name} Into Group
Select Group下面是非常简单的PeopleRepository:
Public Class PeopleRepository
Public Function GetAll() As List(Of Person)
Dim people As New List(Of Person)
people.Add(New Person With {.Name = "Test Name #1", .Age = 33})
people.Add(New Person With {.Name = "Test Name #1", .Age = 33})
people.Add(New Person With {.Name = "Test Name #2", .Age = 0})
people.Add(New Person With {.Name = "Test Name #3", .Age = 0})
people.Add(New Person With {.Name = "Test Name #4", .Age = 0})
people.Add(New Person With {.Name = "Test Name #5", .Age = 35})
people.Add(New Person With {.Name = "Test Name #1", .Age = 39})
Return people
End Function
End Class下面是一个更简单的Person类:
Public Class Person
Property Name As String
Property Age As Integer
End Class显然,这都是为了测试目的而设置的代码。执行peopleByAgeAndName查询后,我希望得到6个组。每个包含一个Person对象,除了对应于"Test Name #1“和年龄33的组。但是,无论我做什么,我都会得到7组,每组一个元素。
有什么想法吗?我想知道这对于LINQ-to-Objects来说是否正常?再说一次,这都是测试代码。我只是想更好地理解它是如何工作的。我的理解是,当使用匿名对象作为键时,它应该对组进行逐个属性的比较。我应该得到6组,而不是7组。
谢谢!
更新-
对于记录,用C#重写的查询完全按照我的预期执行:
var peopleByAgeAndName =
from p in peopleRepository.GetAll()
group p by new {p.Age, p.Name} into g
select g;我得到了6组而不是7组。我还确认了组密钥在VB中不可用,但在C#中可用。有点奇怪。
发布于 2011-05-13 00:41:28
我找到了解决我的假象的办法...在Visual Basic中,必须将"Key“属性添加到可用于确定唯一性的匿名类型中的任何属性:
Dim peopleByAgeAndName = _
From p In (New PeopleRepository).GetAll
Group p By k = New With {Key p.Age, Key p.Name} Into g = Group
Select g现在工作起来像个护身符!谢谢你们的建议!
发布于 2011-05-05 00:29:15
您需要一个IEqualityComparer,它可以根据Ids为您提供不同的对象。
发布于 2011-05-05 00:36:08
组密钥是您想要分组的依据。您正在混和组和选择:
var grp=from p in persons
group p by p.Name into g
select new {g.Key, Ages=g};然后,您可以像这样迭代:
foreach(var name in grp)
{
Console.WriteLine(name.Key);
foreach(var age in name)
Console.WriteLine(" "+age.Age);
}虽然这非常简单,但更好的分组应该是这样的:
var grp=from p in persons
group p by p.Name into g
select new {Name=g.Key, Ages=from a in g
select a.Age};https://stackoverflow.com/questions/5886610
复制相似问题