web-dev-qa-db-ja.com

複数のフィールドのLinqグループ-VB.NET、匿名、キー

私は困惑しています。私は助けが必要です。患者の住所データが重複しているDTOオブジェクトがあります。一意のアドレスのみを取得する必要があります。

Dim PatientAddressDto = New List(Of PatientAddress)

{Populate PatientAddressDto with lots of duplicate data}

PatientAddressDto = (From d In PatientAddressDto
                    Group d By PatientAddressDtoGrouped = New PatientAddress With {
                                                              .Address1 = d.Address1,
                                                              .Address2 = d.Address2,
                                                              .City = d.City,
                                                              .State = d.State,
                                                              .Zip = d.Zip
                                                              }
                  Into Group
                  Select New PatientAddress With {
                                                  .Address1 = PatientAddressDtoGrouped.Address1,
                                                  .Address2 = PatientAddressDtoGrouped.Address2,
                                                  .City = PatientAddressDtoGrouped.City,
                                                  .State = PatientAddressDtoGrouped.State,
                                                  .Zip = PatientAddressDtoGrouped.Zip
                                                  }).ToList()

私は運が悪かったので以下を試しました:

PatientAddressDto = (From d In PatientAddressDto
                    Select New PatientAddress With {
                                                  .Address1 = d.Address1,
                                                  .Address2 = d.Address2,
                                                  .City = d.City,
                                                  .State = d.State,
                                                  .Zip = d.Zip
                                                    }).Distinct     

そしてまた

PatientAddressDto = PatientAddressDto.GroupBy(Function(p) New PatientAddress With {
                                                  .Address1 = p.Address1,
                                                  .Address2 = p.Address2,
                                                  .City = p.City,
                                                  .State = p.State,
                                                  .Zip = p.Zip
                                                    })
17
wavedrop

匿名型 を使用し、 Keyキーワード を使用して、平等が期待どおりに動作するようにすることができます(C#では必要ありません)。

Keyプレフィックスを指定してグループを変更し、PatientAddressの使用法を削除します。

Group d By PatientAddressDtoGrouped = New With {
    Key .Address1 = d.Address1,
    Key .Address2 = d.Address2,
    Key .City = d.City,
    Key .State = d.State,
    Key .Zip = d.Zip
}
24
Ahmad Mageed

次のコードが機能することがわかりました。これにより、必要なグループ化が基本的に実行され、新しいオブジェクトがタイプPatientAddressとして入力されるため、匿名オブジェクトとキーワードKeyの使用が不要になります。

多分誰かがそれを説明することができます、現時点では私はできません。ごきげんよう。

Dim PatientAddressDto = New List(Of PatientAddress)

{Populate PatientAddressDto with lots of duplicate data}

PatientAddressDto = (From d In PatientAddressDto
                    Group d By d.Address1,
                                d.Address2,
                                d.City,
                                d.State,
                                d.Zip Into g =
                    Group Let grp = New PatientAddress With {.Address1 = Address1,
                                                                .Address2 = Address2,
                                                                .City = City,
                                                                .State = State,
                                                                .Zip = Zip}
                    Select grp).ToList()
4
wavedrop

おそらく、PatientAddressGetHashCodeEqualsをオーバーライドしないためです。別の方法は、グループ化のための 匿名型 です。書いてみてください:

Group d By PatientAddressDtoGrouped = New With { Key .Address1 = d.Address1, ....
3
Magnus