2012-06-20 7 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を参照してください。

関連する問題