2012-06-20 63 views
6

我試圖做到這一點像我在C#中,與匿名類型,但結果是不正確的。如何使用GroupBy()在VB.NET中對多列進行分組?

VB.NET示例(錯誤輸出):

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#示例(正確的輸出):

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; } 
    } 
} 

有人看到我的錯誤在哪裏嗎?

回答

12

在VB代碼中創建匿名類型時,需要使用Key修飾符。默認情況下,它會創建讀/寫屬性,而C#匿名類型爲總是只讀。在Equals/GetHashCode中只使用只讀屬性。

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

有關更多詳細信息,請參閱documentation for anonymous types in VB

相關問題