如何使用 GroupBy() 通过 VB.NET 对多列进行分组? [英] How to use GroupBy() to group over multiple columns with VB.NET?

查看:74
本文介绍了如何使用 GroupBy() 通过 VB.NET 对多列进行分组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试像在 C# 中那样使用匿名类型执行此操作,但结果不正确.

i tried to do this like i would in C#, with an anonymous type but the result is just not correct.

VB.NET 示例(错误输出):

VB.NET example (wrong output):

Module Module1

Sub Main()
    Dim ls As List(Of Employee) = New List(Of Employee)
    ls.Add(New Employee With {.Age = 20, .Sex = "M"})
    ls.Add(New Employee With {.Age = 20, .Sex = "M"})
    ls.Add(New Employee With {.Age = 20, .Sex = "M"})
    ls.Add(New Employee With {.Age = 30, .Sex = "F"})
    ls.Add(New Employee With {.Age = 30, .Sex = "F"})

    For Each item In ls.GroupBy(Function(k) New With {.Age = k.Age, .Sex = k.Sex})
        Console.WriteLine(String.Format("Group [Age: {0}, Sex: {1}] : {2} Item(s)", item.Key.Age, item.Key.Sex, item.Count()))
    Next

    Console.ReadLine()
End Sub

Class Employee
    Private _Age As Integer
    Public Property Age() As Integer
        Get
            Return _Age
        End Get
        Set(ByVal value As Integer)
            _Age = value
        End Set
    End Property

    Private _Sex As String
    Public Property Sex() As String
        Get
            Return _Sex
        End Get
        Set(ByVal value As String)
            _Sex = value
        End Set
    End Property
End Class
End Module

输出:

Group [Age: 20, Sex: M] : 1 Item(s)
Group [Age: 20, Sex: M] : 1 Item(s)
Group [Age: 20, Sex: M] : 1 Item(s)
Group [Age: 30, Sex: F] : 1 Item(s)
Group [Age: 30, Sex: F] : 1 Item(s)

所需的输出:

Group [Age: 20, Sex: M] : 3 Item(s)
Group [Age: 30, Sex: F] : 2 Item(s)

C# 示例(正确输出):

C# example (correct output):

class Program
{
    static void Main(string[] args)
    {
        List<Employee> ls = new List<Employee>();
        ls.Add(new Employee { Age = 20, Sex = "M" });
        ls.Add(new Employee { Age = 20, Sex = "M" });
        ls.Add(new Employee { Age = 20, Sex = "M" });
        ls.Add(new Employee { Age = 30, Sex = "F" });
        ls.Add(new Employee { Age = 30, Sex = "F" });

        foreach (var item in ls.GroupBy(k => new { Age = k.Age, Sex = k.Sex }))
        {
            Console.WriteLine(String.Format("Group [Age: {0}, Sex: {1}] : {2} Item(s)", item.Key.Age, item.Key.Sex, item.Count()));
        }
        Console.ReadLine();
    }

    class Employee
    {
        public int Age { get; set; }
        public string Sex { get; set; }
    }
}

有人看到我的错误在哪里吗?

does anybody see where my error is?

推荐答案

在 VB 代码中创建匿名类型时需要使用 Key 修饰符.默认情况下,它创建读/写属性,而 C# 匿名类型总是只读.Equals/GetHashCode 中仅使用只读属性.

You need to use the Key modifier when creating the anonymous types in the VB code. By default it creates read/write properties whereas C# anonymous types are always read-only. Only read-only properties are used in Equals / GetHashCode.

For Each item In ls.GroupBy(Function(k) New With { Key .Age = k.Age, _
                                                   Key .Sex = k.Sex})

有关详细信息,请参阅有关 VB 中匿名类型的文档.

See the documentation for anonymous types in VB for more details.

这篇关于如何使用 GroupBy() 通过 VB.NET 对多列进行分组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆