0

LINQグループ化クエリで使用されるオブジェクトを定義して、強く型付けできるようにする方法がわかりません。

2つの複雑なオブジェクトをキーとして使用するグループ化クエリを作成しました。クエリは機能しますが、戻りオブジェクトタイプを宣言できるようにしたいと思います。

私は複雑なタイプを持っています...

Public Class Student
    Public Name As IndividualsName
    Public EnrolledSchool As School
    Public BirthHospital As BirthPlace
    Public Grade As Integer

    Public Sub New(ByVal name As IndividualsName, ByVal enrolledSchool As School, ByVal birthHospital As BirthPlace, ByVal grade As Integer)
        Me.Name = name
        Me.EnrolledSchool = enrolledSchool
        Me.BirthHospital = birthHospital
        Me.Grade = grade
    End Sub

End Class

Public Class School
    Inherits Location


    Public Sub New(ByVal name As String, ByVal city As String, ByVal state As String)
        MyBase.New(name, city, state)
    End Sub

    Public Shared Function GetMyHS() As School
        Return New School("My High School", "My City", "My State")
    End Function
    Public Shared Function GetYourHS() As School
        Return New School("Your High School", "Your City", "Your State")
    End Function
    Public Shared Function GetMyElementry() As School
        Return New School("My Elementary", "My City", "My State")
    End Function
    Public Shared Function GetMyMiddleSchool() As School
        Return New School("My Middle School", "My City", "My State")
    End Function

End Class

Public Class IndividualsName
    Public First As String
    Public Last As String

    Public Sub New(ByVal first As String, ByVal last As String)
        Me.First = first
        Me.Last = last
    End Sub

    Public Overrides Function ToString() As String
        Return First & " " & Last
    End Function
End Class

Public Class BirthPlace
    Inherits Location

    Public Sub New(ByVal name As String, ByVal city As String, ByVal state As String)
        MyBase.New(name, city, state)
    End Sub

    Public Shared Function GetMyHospital() As BirthPlace
        Return New BirthPlace("My General Hospital", "My City", "My State")
    End Function

    Public Shared Function GetYourHospital() As BirthPlace
        Return New BirthPlace("Your General Hospital", "Your City", "Your State")
    End Function
End Class

Public Class Location
    Public Name As String
    Public City As String
    Public State As String

    Public Sub New(ByVal name As String, ByVal city As String, ByVal state As String)
        Me.Name = name
        Me.City = city
        Me.State = state
    End Sub

    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        Return Me.GetHashCode = obj.GetHashCode
    End Function

    Public Overrides Function GetHashCode() As Integer
        Dim returnValue As Integer
        returnValue = Me.Name.GetHashCode() Xor Me.City.GetHashCode() Xor Me.State.GetHashCode()
        Return returnValue
    End Function

End Class

リストに集めて、2つの複雑なキーに基づいてグループ化しています。

Sub Main()

    Dim students As List(Of Student) = New List(Of Student)

    students.Add(New Student(New IndividualsName("Bill", "Jones"), School.GetMyHS(), BirthPlace.GetMyHospital(), 9))
    students.Add(New Student(New IndividualsName("George", "Jamesen"), School.GetMyHS(), BirthPlace.GetMyHospital(), 11))
    students.Add(New Student(New IndividualsName("Chris", "McCartney"), School.GetYourHS(), BirthPlace.GetMyHospital(), 9))
    students.Add(New Student(New IndividualsName("Sara", "Smith"), School.GetMyMiddleSchool(), BirthPlace.GetMyHospital(), 7))
    students.Add(New Student(New IndividualsName("Josh", "Jefferies"), School.GetMyMiddleSchool(), BirthPlace.GetYourHospital(), 8))
    students.Add(New Student(New IndividualsName("Mel", "Tompson"), School.GetMyHS(), BirthPlace.GetMyHospital(), 12))
    students.Add(New Student(New IndividualsName("Jill", "Schmidt"), School.GetYourHS(), BirthPlace.GetMyHospital(), 10))
    students.Add(New Student(New IndividualsName("Beth", "Taylor"), School.GetMyElementry(), BirthPlace.GetMyHospital(), 5))
    students.Add(New Student(New IndividualsName("Mark", "Thatcher"), School.GetMyElementry(), BirthPlace.GetMyHospital(), 4))
    students.Add(New Student(New IndividualsName("Tom", "Jones"), School.GetMyHS(), BirthPlace.GetYourHospital(), 9))
    students.Add(New Student(New IndividualsName("Kevin", "Woo"), School.GetMyMiddleSchool(), BirthPlace.GetYourHospital(), 7))

    Dim groupedQuery 'As IEnumerable(Of IGrouping())
    groupedQuery = From student In students _
                   Group student By student.EnrolledSchool, student.BirthHospital Into Group _
                 Select EnrolledSchool, BirthHospital, StudentGroup = Group

    For Each groupItem In groupedQuery
        Console.WriteLine(String.Format("School: {0}, Birth Place: {1}", groupItem.EnrolledSchool.Name, groupItem.BirthHospital.Name))
        'Console.WriteLine(String.Format("Group Item is type {0}.", groupItem.GetType()))

        For Each item As Student In groupItem.StudentGroup
            Console.WriteLine(String.Format("Name: {0} - Grade: {1}", item.Name.ToString(), item.Grade.ToString()))
        Next

    Next
End Sub

すべてが機能しますが、データ収集を処理するときにすべてが匿名で宣言されるのは気になります。これは、グループ化されたリストを作成するオブジェクトが1つのアセンブリにあり、WebサービスとWebサイトで使用されている場合に特に厄介です。

返されるIEnumberableを強く入力できるようにしたいのですが、IGroupingインターフェイスを宣言する方法がわかりません。

次のようにデータ構造を横断できるはずです...

    Dim groupedQuery As IEnumerable(Of IGrouping(Of IDoNotKnowHowToDeclareMyComplexKey, Student))
    groupedQuery = From student In students _
                   Group student By student.EnrolledSchool, student.BirthHospital Into Group _
                 Select EnrolledSchool, BirthHospital, StudentGroup = Group

    For Each groupItem As IGrouping(Of IDoNotKnowHowToDeclareMyComplexKey, Student) In groupedQuery
        Console.WriteLine(String.Format("School: {0}, Birth Place: {1}", groupItem.Key.Name)
        For Each item As Student In groupItem
            Console.WriteLine(String.Format("Name: {0} - Grade: {1}", item.Name.ToString(), item.Grade.ToString()))
        Next

    Next

しかし、これまでのところ、IGroupingタイプを宣言する方法を理解できていません。

4

2 に答える 2

2

ブライアンが言ったように、新しいクラスを作成します。

Public Class SomeName
    Public EnrolledSchool As School
    Public BirthHospital As BirthPlace
    Public StudentGroup As IEnumerable(Of Student)
End Class

次に、グループ化中に使用します。

Dim result As IEnumerable(Of SomeName)
result = (From student In students _
 Group student By student.EnrolledSchool, student.BirthHospital Into Group _
 Select New SomeName With {.EnrolledSchool = EnrolledSchool, .BirthHospital = BirthHospital, .StudentGroup = Group})

問題がある場合は、ここにコードと発生したエラーを配置してください。

于 2009-11-21T13:42:02.970 に答える
1

定義上、匿名のものは名前で呼ぶことはできません。

複雑なキータイプを表す新しいクラスを作成し、匿名タイプの代わりにそれを使用する必要があります。

于 2009-11-20T21:47:20.390 に答える