繁体   English   中英

LINQ Group多个值在VB.NET中不能很好地工作但在C#中运行良好

[英]LINQ Group By multiple values does not work well in VB.NET but work well in C#

我发现当按多个值组合并不能很好地与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;}
 }

此查询应该有效:

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()}

您错过了关键字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()}) 

作为参考,在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属性的匿名类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM