【C#】List型とLINQ(Distinctメソッド)

スポンサーリンク

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組

コメント

タイトルとURLをコピーしました