7

匿名型を使用して、C#の場合と同じようにこれを実行しようとしましたが、結果が正しくありません。

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

誰かが私のエラーがどこにあるかわかりますか?

4

1 に答える 1

20

KeyVBコードで匿名型を作成するときは、修飾子を使用する必要があります。デフォルトでは、読み取り/書き込みプロパティが作成されますが、C#匿名型は常に読み取り専用です。Equals/では読み取り専用プロパティのみが使用されGetHashCodeます。

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

詳細については、VBの匿名タイプのドキュメントを参照してください。

于 2012-06-20T14:04:12.030 に答える