LinqまたはLambda式を使用して複雑なオブジェクトの重複を確認する

StackOverflow https://stackoverflow.com/questions/223400

  •  03-07-2019
  •  | 
  •  

質問

linqとlambda式の学習を始めたばかりで、それらは複雑なオブジェクトコレクションで重複を見つけるのに適しているようですが、少し混乱しているので、誰かが私を助けてくれることを願っています幸せなコーディングに。

私のオブジェクトはlist.list.uniqueCustomerIdentifierのように構成されています

複雑なオブジェクト全体に重複するuniqueCustomerIdentifierがないことを確認する必要があります。重複がある場合は、重複しているものを特定し、重複のリストを返す必要があります。

役に立ちましたか?

解決

  • 階層を展開する
  • 各要素をuniqueIDプロパティに投影します
  • これらのIDをグループ化します
  • 複数の要素を持つグループでグループをフィルタリングします
  • 各グループをグループのキーに投影する(uniqueIDに戻る)
  • クエリを列挙し、結果をリストに保存します。

var result = 
  myList
    .SelectMany(x => x.InnerList)
    .Select(y => y.uniqueCustomerIdentifier)
    .GroupBy(id => id)
    .Where(g => g.Skip(1).Any())
    .Select(g => g.Key)
    .ToList()

他のヒント

linq演算子Distinct()があります。これにより、IDのみが必要な場合に、レコードの異なるセットに絞り込むことができます。オーバーライドするようにクラスを設定した場合、または IEqualityComparer Distinct拡張メソッドを直接呼び出して、リストから一意の結果を返すことができます。追加のボーナスとして、UnionおよびIntersectメソッドを使用して、2つのリストをマージまたはフィルターすることもできます。

もう1つのオプションは、IDでグループ化し、最初の要素を選択することです。

var results = from item in list
              group item by item.id into g
              select g.First();

2つのリスト階層をフラット化する場合は、SelectManyメソッドを使用してIEnumerable<IEnumerable<T>>IEnumerable<T>にフラット化します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top