情報応用演習Ⅰ(2024)

【T2c】LINQ(3/4)

プロジェクトタイプC#コンソールアプリ※
プロジェクト名T2c
ソリューション名PIT2
ターゲットフレームワーク.NET 8.0(長期的なサポート)
最上位レベルのステートメントを使用しない使用する(チェックオフ)

※ 「コンソールアプリ(.NET Framework)」ではないので注意せよ!

注意
  • 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
    • 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
    • プロジェクトの作成作業については従来の絞り込み処理を参照せよ.

2c-3. LINQを用いた絞り込み処理

LINQを用いると同じ絞り込み処理をより簡便に実装することができる.LINQを使用するには, System.Linq名前空間のクラスが必要なので,LINQを使用するコードの冒頭に_のような usingディレクティブを追記する必要がある.

LINQの使用に必要なusingディレクティブ
1
using System.Linq;

ただし.NET 6.0以降ではこのusingディレクティブは, 暗黙的に追加されているusingディレクティブに含まれているため 明示的に記述する必要はない.

ではリスト2c-2-2と同じ絞り込み処理をLINQを使って書き換えてみよう. Program.cs を_に示すようにに書き換える.

Program.csの内容 - LINQを用いた絞り込み処理
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
using T2c;

var students = new[]
{
    // ... (長いので省略) ...
};// end of array

// LINQの使用例
var query = (from s in students
             where s.Birthday.Year <= 2000
             select s);

foreach (var s in query) // ↑の式は foreach 文などで使用できる.
{
    Console.WriteLine($"{s.ID,2}: {s.Name} ({s.Birthday:yyyy-MM-dd})");
}//foreach

書き換えたら実行してみよう.図2c-2-1と同じ実行結果が得られるはずである. _

1
2
3
from s in students
where s.Birthday.Year <= 2000
select s

の部分がLINQの式である.見ての通りSQLのSELECT文に非常によく似た形になっている. SELECT文との違いは句の順序である.SQLのSELECT文とLINQの式の構文的な対応関係を_に示す.

SELECT文とLINQ

各句の書き方にも多少の違いがある点に注が必要である.FROM句にあたる部分は, LINQではfrom 範囲変数名 in リストとなる. 範囲変数名は,以降の where や select 内で条件などを記述するのに使用する 仮置きの変数名である.これは任意の名前を使用してよい._ではsとしている.

リストの部分にはIEnumerableや, IQueryableといったインターフェースを 実装したオブジェクトを使用することができる._では配列を用いているが,C#の配列はすべて IEnumerable<T> を実装するオブジェクトなので,LINQの文脈で使用することができる.

where の部分では絞り込み条件を指定するが,これはC#の通常の条件文を使用することができる. 先ほどの s.Birthday.Year <= 2000 という条件式に,たとえば「誕生月が3月である」という条件を 加えたければ && 演算子を用いればよい.実際に Program.cs に_に示す内容を追記してみよう.

Program.csの内容 - LINQを用いた絞り込み2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
using T2c;

var students = new[]
{
    // ... (長いので省略) ...
};// end of array

// LINQの使用例
var query = (from s in students
             where s.Birthday.Year <= 2000 && s.Birthday.Month == 3
             select s);

foreach (var s in query) // ↑の式は foreach 文などで使用できる.
{
    Console.WriteLine($"{s.ID,2}: {s.Name} ({s.Birthday:yyyy-MM-dd})");
}//foreach

_の実行結果は,_のようになる.

 1: 想影 真心 (2000-03-08)
 5: 石凪 萌太 (2000-03-08)
15: 嵯峨埜 鵜鷺 (2000-03-25)
 4: 闇口 崩子 (2000-03-22)
 9: 江本 智恵 (2000-03-28)
 6: 七々見 奈波 (1980-03-11)
実行結果

また,SQLのSELECT文ではORDER BY句を用いて結果の表をソートすることができるが,LINQでも同等のことが可能である. Program.csに_に示す1行を追記してみよう.

Program.csの内容 - LINQを用いたソート
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
using T2c;

var students = new[]
{
    // ... (長いので省略) ...
};// end of array

// LINQの使用例
var query = (from s in students
             where s.Birthday.Year <= 2000 && s.Birthday.Month == 3
             orderby s.ID ascending
             select s);

foreach (var s in query) // ↑の式は foreach 文などで使用できる.
{
    Console.WriteLine($"{s.ID,2}: {s.Name} ({s.Birthday:yyyy-MM-dd})");
}//foreach

実行結果は_のようになる.各学生のIDの昇順でソートされていることがわかるだろう.

 1: 想影 真心 (2000-03-08)
 4: 闇口 崩子 (2000-03-22)
 5: 石凪 萌太 (2000-03-08)
 6: 七々見 奈波 (1980-03-11)
 9: 江本 智恵 (2000-03-28)
15: 嵯峨埜 鵜鷺 (2000-03-25)
実行結果

_の orderby の行をorderby s.ID descending(IDの降順)やorderby s.Birthday(誕生日の日付順) などに変更して,結果がどのように変化するかを試してみよう.

Last updated on 2024-04-26
Published on 2024-04-26

Powered by Hugo. Theme by TechDoc. Designed by Thingsym.