首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ-to-Objects --这个简单的组合键分组有什么问题?

LINQ-to-Objects --这个简单的组合键分组有什么问题?
EN

Stack Overflow用户
提问于 2011-05-05 00:22:19
回答 3查看 641关注 0票数 1

好了伙计们。第一次在这里发问。我正在尝试演示LINQ的几个功能,但遇到了一些问题。以下查询未按预期执行:

代码语言:javascript
复制
Dim peopleByAgeAndName = _
    From p In (New PeopleRepository).GetAll
    Group By key = New With {p.Age, p.Name} Into Group
    Select Group

下面是非常简单的PeopleRepository:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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#重写的查询完全按照我的预期执行:

代码语言:javascript
复制
 var peopleByAgeAndName =
        from p in peopleRepository.GetAll()
        group p by new {p.Age, p.Name}  into g 
        select g;

我得到了6组而不是7组。我还确认了组密钥在VB中不可用,但在C#中可用。有点奇怪。

EN

回答 3

Stack Overflow用户

发布于 2011-05-13 00:41:28

我找到了解决我的假象的办法...在Visual Basic中,必须将"Key“属性添加到可用于确定唯一性的匿名类型中的任何属性:

代码语言:javascript
复制
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

现在工作起来像个护身符!谢谢你们的建议!

票数 1
EN

Stack Overflow用户

发布于 2011-05-05 00:29:15

您需要一个IEqualityComparer,它可以根据Ids为您提供不同的对象。

票数 0
EN

Stack Overflow用户

发布于 2011-05-05 00:36:08

组密钥是您想要分组的依据。您正在混和组和选择:

代码语言:javascript
复制
var grp=from p in persons
        group p by p.Name into g
        select new {g.Key, Ages=g};

然后,您可以像这样迭代:

代码语言:javascript
复制
foreach(var name in grp)
{
  Console.WriteLine(name.Key);

  foreach(var age in name)
    Console.WriteLine("  "+age.Age);
}

虽然这非常简单,但更好的分组应该是这样的:

代码语言:javascript
复制
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};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5886610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档