MyObject()
{
String dept;
List<int> id;
Object obj;
}
を使用してLINQ
、次のように整理された上記のオブジェクトのリストを返すにはどうすればよいですか。
すべての obj オブジェクトを [ department and EQUAL id list ] でグループ化します。同じ番号が含まれている場合、リストは等しいと見なされますが、必ずしも同じ順序 (セット) である必要はありません。
GroupBy
カスタムを受け入れるオーバーロードがありますIEqualityComparer<MyObject>
。が等しいときに2つのオブジェクトが等しいと見なし、等しいと見なされるオブジェクトを記述し、dept
それid
を引数として渡します。
セットの等式を実装する便利な方法は、次のように記述します。
new HashSet(x.id).SetEquals(new HashSet(y.id))
ただし、これは非効率的であり、比較することがたくさんある場合はおそらく最善のアイデアではありません。
Jon's answerから構築すると、効率が問題になる場合は、 HashSet
for each オブジェクトを匿名オブジェクトに格納できます。
myObjects.Select(x => new { myObject = x, hashSet = new HashSet(x.id) })
.GroupBy(x => x.hashSet, HashSet<int>.CreateSetComparer())
.SelectMany(x => x.GroupBy(y => y.myObject.dept))
1 つだけ実行したい場合は、またはカスタム クラスにGroupBy
保存できますが、独自の を作成する必要があります。HashSet
Tuple
IEqualityComparer