LINQ(リンク)を使いこなす第4弾です。
要素の重複を削除するメソッドを紹介します。
Distinctメソッドです。
この記事では、メソッド構文で紹介します。
実は、Distinctメソッドはクエリ構文では存在しませんが、
クエリ構文で仮に記載する場合を補足として最後に紹介しようと思います。
前提の定義
NameSpace
using System.Linq;
構造体
struct SchoolClass
{
internal int Grade; //年
internal int ClassNo; //組
}
データソース(データ元)
//サンプル用のデータ 作成(単純ver)
List<int> lstSample = new List<int> { 4, 16, 8, 2, 1, 2, 8 };
//サンプル用のデータ 作成(構造体ver)
List<SchoolClass> lstSchool = new List<SchoolClass>
{
new SchoolClass{ Grade=1, ClassNo=1 }, //1年1組
new SchoolClass{ Grade=3, ClassNo=2 }, //3年2組
new SchoolClass{ Grade=1, ClassNo=2 }, //1年2組
new SchoolClass{ Grade=2, ClassNo=2 }, //2年2組
new SchoolClass{ Grade=2, ClassNo=1 }, //2年1組
new SchoolClass{ Grade=3, ClassNo=1 }, //3年1組
new SchoolClass{ Grade=3, ClassNo=2 }, //3年2組
};
Distinctメソッド
冒頭でも説明しましたが、『Distinctメソッドは、要素の重複を削除するメソッド』です。
ここでは、どのように使うかサンプルを用いて紹介します。※サンプルの定義は上記参照
処理の流れとしては、Selectメソッドで学年を抽出し、抽出した学年の中の要素で被っている要素は削除します。
//学年を抽出し、重複を削除
List<int> SchoolGrade = lstSchool.Select(x => x.Grade).Distinct().ToList();
SchoolGrade.ForEach(a => Console.WriteLine(a + "年"));
//結果
//1年
//3年
//2年
構造体の重複でも対応はしています。
//構造体のまま、重複の削除
List<SchoolClass> School = lstSchool.Distinct().ToList();
School.ForEach(a => Console.WriteLine(a.Grade + "年" + a.ClassNo + "組"));
//結果
//1年1組
//3年2組
//1年2組
//2年2組
//2年1組
//3年1組
リスト内の重複の削除であれば、そのままDistinctメソッドを使うといいでしょう。
まとめ
Distinctメソッドについて紹介いたしました。
Distinctメソッドでは、データの重複を削除する事が出来ます。
構造体そのままで重複の削除をすることが可能なのは、メリットが大きいです。
使い方としては、Selectメソッドとセットで使う事が多い気がします。
補足(クエリ構文で書いた場合)
冒頭でも述べましたが、クエリ構文ではDistinct句は存在しません。
その為、サンプルの流れとしては、下記のようになります。
クエリ構文でデータの抽出/整理を行った上でメソッド構文でDistinctメソッドを使う流れとなります。
//学年を抽出し、重複を削除
var SchoolGradeQ =
(
from x in lstSchool
select x.Grade
).Distinct();
foreach (var s in SchoolGradeQ) Console.WriteLine(s + "年");
//結果
//1年
//3年
//2年
//構造体のまま、重複の削除
var SchoolQ =
(
from x in lstSchool
select x
).Distinct();
foreach (var s in SchoolQ) Console.WriteLine(s.Grade + "年" + s.ClassNo + "組");
//結果
//1年1組
//3年2組
//1年2組
//2年2組
//2年1組
//3年1組
業務でプログラミング(C#/VB/Python)を作っている。
挫折を何回も繰り返し、幾度の壁を乗り越えてきた。
乗り越えてきた事を忘れないように記録に残す。
同じ思いをしている人への情報提供になれたらと思う。
基本は初心者に向けたプログラムの情報を提供する。
コメント