【问题标题】:LINQ Group By multiple values does not work well in VB.NET but work well in C#LINQ Group By multiple values 在 VB.NET 中效果不佳,但在 C# 中效果很好
【发布时间】:2012-05-29 15:09:38
【问题描述】:

我发现当按多个值分组时不适用于 VB.NET,但它适用于 C#,这是我的代码,我的 VB.NET 代码有问题吗?

这是我的 VB.NET 代码:

Sub Main
  Dim empList As New List(Of Employee)()
    empList.Add(New Employee() With _
    {.ID = 1, .FName = "John", .Age = 23, .Sex = "M"c}) 
    empList.Add(New Employee() With _
    {.ID = 2, .FName = "Mary", .Age = 25, .Sex = "F"c})
    empList.Add(New Employee() With _
    {.ID = 3, .FName = "Amber", .Age = 23, .Sex = "M"c}) 
    empList.Add(New Employee() With _
    {.ID = 4, .FName = "Kathy", .Age = 25, .Sex = "F"c})
    empList.Add(New Employee() With _
    {.ID = 5, .FName = "Lena", .Age = 27, .Sex = "F"c}) 
    empList.Add(New Employee() With _
    {.ID = 6, .FName = "Bill", .Age = 28, .Sex = "M"c})
    empList.Add(New Employee() With _
    {.ID = 7, .FName = "Celina", .Age = 27, .Sex = "F"c}) 
    empList.Add(New Employee() With _
    {.ID = 8, .FName = "John", .Age = 28, .Sex = "M"c})

Dim query = empList.GroupBy(Function(x)  New With { .Age=x.Age, .Sex= x.Sex}) _
            .Select(Function(g) New With {g.Key, g.Count()}) 

For Each employee In query 
         Console.WriteLine(employee.Count)
Next employee 
End Sub


Public Class Employee 
    Private privateID As Integer
    Public Property ID() As Integer 

        Get 
            Return privateID
        End Get 

        Set(ByVal value As Integer) 
            privateID = value
        End Set 

    End Property 

    Private privateFName As String 
    Public Property FName() As String
        Get 
            Return privateFName
        End Get 

        Set(ByVal value As String) 
            privateFName = value
        End Set 
    End Property  

    Private privateAge As Integer 
    Public Property Age() As Integer
        Get 
            Return privateAge
        End Get 

        Set(ByVal value As Integer) 
            privateAge = value
        End Set 
    End Property  

    Private privateSex As Char 
    Public Property Sex() As Char
        Get 
            Return privateSex
        End Get 

        Set(ByVal value As Char) 
            privateSex = value
        End Set 
    End Property
End Class 

employee.Count 的输出都是 1,这是错误的。 我用C#试了一下,效果很好,结果是对的。

//Here are my C# code:

void Main()
{
 var empList =new List<Employee>
 {
    new Employee {ID = 1, FName = "John", Age = 23, Sex = 'M'},
    new Employee {ID = 2, FName = "Mary", Age = 25, Sex = 'F'},
    new Employee {ID = 3, FName = "Amber", Age = 23, Sex = 'M'},
    new Employee {ID = 4, FName = "Kathy", Age = 25, Sex = 'F'},
    new Employee {ID = 5, FName = "Lena", Age = 27, Sex = 'F'},
    new Employee {ID = 6, FName = "Bill", Age = 28, Sex = 'M'},
    new Employee {ID = 7, FName = "Celina", Age = 27, Sex = 'F'},
    new Employee {ID = 8, FName = "John", Age = 28, Sex = 'M'} 
 };

var query = empList.GroupBy(x => new { x.Age,  x.Sex})
                   .Select(g=>new {g.Key, Count=g.Count()}); 

foreach (var employee in query )
   Console.WriteLine(employee.Count);

 }


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

【问题讨论】:

  • 如果你得到你想要的信息,不要忘记将答案标记为已接受...

标签: c# vb.net linq group-by


【解决方案1】:

这个查询应该可以工作:

Dim query =
    From el In empList
    Group el By Key = new with {key el.Age, key el.Sex} 
        Into Group
    Select New  With {.key = Key,
                      .count = Group.Count()}

【讨论】:

  • 谢谢拉娜,它运作良好,我也发现这也运作良好:'From el In empList Group el By el.Age, el.Sex Into Group Select New With {Group, Group. Count()}' 这两个代码有什么区别?谢谢 :) 我的旧代码有什么问题?
【解决方案2】:

您错过了关键字Key

这里是 lambda 表达式查询

Dim query = empList.GroupBy(Function(x)  New With { Key .Age=x.Age, Key .Sex= x.Sex}) _
                   .Select(Function(g) New With {.KeyName = g.Key, .Count = g.Count()}) 

【讨论】:

    【解决方案3】:

    作为参考,在 VB.Net 中您也可以这样编写查询:

    Dim query = From e In empList
                Group e By e.Age, e.Sex Into Group.Count()
    For Each item In query
        Console.WriteLine(e.Count)
    Next
    

    其中“item”是具有 Age、Sex 和 Count 属性的匿名类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-16
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多