2012-06-20 25 views
6

ho provato a farlo come farei in C#, con un tipo anonimo ma il risultato non è corretto.Come utilizzare GroupBy() per raggruppare più colonne con VB.NET?

VB.NET esempio (uscita sbagliato):

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 

uscita:

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) 

output desiderato:

Group [Age: 20, Sex: M] : 3 Item(s) 
Group [Age: 30, Sex: F] : 2 Item(s) 

C# esempio (output corretto):

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

qualcuno vede dove si trova il mio errore?

risposta

12

È necessario utilizzare il modificatore Key durante la creazione dei tipi anonimi nel codice VB. Per impostazione predefinita crea proprietà di lettura/scrittura mentre i tipi anonimi C# sono sempre a di sola lettura. Solo le proprietà di sola lettura vengono utilizzate in Equals/GetHashCode.

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

Vedere la documentation for anonymous types in VB per maggiori dettagli.

Problemi correlati