linq
を使用した特定のプロパティに基づいて一意のレコードを抽出しますlinqのDistinct()
メソッドは、複製要素をコレクションから効率的に削除します。 ただし、複雑なオブジェクト(A List<T>
など)を扱う場合、特定のプロパティに基づいて一意性のみを必要とする場合、オブジェクト全体に直接Distinct()
を使用すると、目的の結果が得られない場合があります。 この記事では、GroupBy
とSelect
。
プロパティベースの一意性のためにグループビーをレバレッジします
特定のプロパティに基づいて異なるレコードを取得するための鍵は、LINQのメソッドを利用することです。 これにより、同じプロパティ(またはプロパティの組み合わせ)を共有する要素をグループ化し、各グループから代表者を選択できます。
GroupBy
オブジェクトには、List<Person>
やPerson
:Id
などのプロパティがあります。
Name
<code>Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name="Test2"</code>オブジェクトを取得するには、次のlinqクエリを使用します。
Person
ここで、Id
<code class="language-csharp">List<Person> distinctPeople = allPeople .GroupBy(p => p.Id) .Select(g => g.First()) .ToList();</code>値でグループ化します。
次に、各グループの最初の要素を選択し、ユニークなGroupBy(p => p.Id)
。
Person
Id
複数のプロパティに拡張Select(g => g.First())
Person
Id
この手法は、複数のプロパティに簡単に拡張されます。
の両方でグループ化する このグループ
との組み合わせに基づいて、両方のプロパティにわたって一意性を確保します。 繰り返しになりますが、Id
各グループから1人の代表者を選択します
FavoriteColor
<code class="language-csharp">List<Person> distinctPeople = allPeople .GroupBy(p => new { p.Id, p.FavoriteColor }) .Select(g => g.First()) .ToList();</code>
Person
このアプローチは、クエリプロバイダーが潜在的に空のグループを処理できることを前提としています。 これが保証されていない場合は、そのようなケースを優雅に処理するためにId
の代わりにFavoriteColor
を使用することを検討してください。
Select(g => g.First())
エンティティフレームワークコアの古いバージョン(バージョン6より前)の場合、代替方法が必要になる場合があります。 ガイダンスについては、このスタックオーバーフロー回答を参照してください:
以上が複雑なオブジェクトの特定のプロパティでLINQの個別()メソッドを使用する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。