自分用メモです。
C#/LINQを用いて重複するものを探すあれこれ
0. はじめに
目的:Memberリストに含まれるメンバーを年齢でグルーピングすること
-
コンストラクタ
- Name string
- Age string
Ageがintではなくstringなのはご愛敬。
1.
年齢でグルーピングし、年齢をIGroupingで返す。
var age = members.GroupBy(s => s.Age);
2.
年齢でグルーピングし、すべてのオブジェクトを返す(実用上はあまり意味がない)。
var allMemberss = members.GroupBy(s => s.Age).SelectMany(grp => grp);
こんなのが返ってくる。
Results View Expanding the Results View will enumerate the IEnumerable
[0] {Customers} Customers
Name "山田太郎" string
Age "19" string
....
3.
年齢でグルーピングし、すべてのオブジェクトを返したのち、重複する2番目のオブジェクトをIEmurable型で取得する。
重複しているものがあるかチェックをしたいときに使える。
var duplicateMembers = members.GroupBy(s => s.Age).SelectMany(grp => grp.Skip(1));
4.
年齢でグルーピングし、グループのカウントが1より大きい年齢をList型で取得する。
重複する年齢が欲しい時に使える。
var duplicateAges = members.GroupBy(s => s.Age).Where(g => g.Count() > 1).Select(g => g.Key).ToList();
5.
年齢でグルーピングし、グループのカウントが1より大きい年齢をもつオブジェクトをList型で取得する。
重複している年齢を持つインスタンスが欲しい時に使える。
List<Customers> duplicateCarNumber2 = customers.GroupBy(s => s.CarNumber).Where(g => g.Count() > 1).SelectMany(g => g).ToList();