2012-05-29 30 views
2

我发现,当通过多个值分组不能很好地与VB.NET协同工作时,但它与C#一起工作良好,这里是我的代码,我的VB.NET代码有什么问题吗?LINQ Group通过多个值在VB.NET中不能很好地工作,但在C#中工作良好

这里是我的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;} 
} 
+0

不要忘记,以纪念答案接受,如果你有你想要的信息... –

回答

6

这个查询应该工作:

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

感谢蛙,它工作得很好,我也发现了这个可以工作得很好过: “从EL在empList 集团埃尔埃尔.Age,el.Sex 进入群组 选择新增{集团, Group.Count()}' 这两个代码有什么区别?谢谢:) 我的旧代码有什么问题? –

+1

@ Tim.Tang - 将其标记为已接受,如果它适合您...欢迎 –

2

你错过了关键字重点

下面是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()}) 
+1

这一个应该被标记为答案。 –

+0

至少这个解释错误发生在哪里。 –

0

作为参考,在VB中.Net你也可以w这样的查询:

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 

其中'项目'是一个具有年龄,性别和计数属性的匿名类型。

相关问题