SelectとProjection
データを新しい形に整えます。
「SelectとProjection」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。
射影とは
Select は、シーケンスの各要素を新しい形に変換します。これを射影と呼びます。
1つの要素を結果に変換するラムダ式を受け取り、その結果のシーケンスを返します。元のシーケンスは変更されません。
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4 };
var squares = nums.Select(n => n * n);
Console.WriteLine(string.Join(", ", squares));型を変更する
射影では、要素の型そのものを変更できます。int を string に変換すると、IEnumerable<string> が生成されます。
出力の型はラムダ式の戻り値の型から推論されるため、コンパイラーが自動的に追跡してくれます。
using System;
using System.Linq;
int[] nums = { 10, 20, 30 };
var labels = nums.Select(n => $"Item #{n}");
foreach (var l in labels) Console.WriteLine(l);プロパティを射影する
よくある使い方は、オブジェクトから1つのプロパティを取り出すことです。Select(p => p.Name) を使うと、オブジェクトのリストを名前のリストに変換できます。
これにより、後続の処理や表示に必要なデータだけに絞り込めます。
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var names = users.Select(u => u.Name);
Console.WriteLine(string.Join(", ", names));匿名型の結果
複数のフィールドをまとめて保持するために、匿名型へ射影できます。ラムダ式の中で new { ... } を使用してください。
コンパイラーが読み取り専用プロパティを持つクラスをその場で生成するため、中間結果の形を整えるのに適しています。
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
var users = new List<User> { new("Ana", 30), new("Bo", 25) };
var shaped = users.Select(u => new { u.Name, IsAdult = u.Age >= 18 });
foreach (var s in shaped) Console.WriteLine($"{s.Name}:{s.IsAdult}");インデックス付きのSelect
Where と同様に、Select にも0始まりのインデックスを取得できるオーバーロードがあります。ラムダ式は (element, index) を受け取ります。
項目に番号を付けたり、各値とその位置を組み合わせたりするのに最適です。
using System;
using System.Linq;
string[] tasks = { "Wake", "Eat", "Code" };
var numbered = tasks.Select((t, i) => $"{i + 1}. {t}");
foreach (var n in numbered) Console.WriteLine(n);クエリ構文のSelect
クエリ構文では、select 句が射影を行います。要素そのものや、要素に基づく任意の式を選択できます。
where と組み合わせると、読みやすい1つのクエリでフィルタリングと形の変換を行えます。
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5 };
var result = from n in nums
where n % 2 == 1
select n * 10;
Console.WriteLine(string.Join(", ", result));SelectManyで平坦化する
各要素をコレクションに変換する場合、Select を使うとシーケンスのシーケンスになります。SelectMany はそれらを平坦化し、1つのシーケンスにします。
これは、内側のループの結果を連結する入れ子のループに相当する LINQ の機能です。
using System;
using System.Linq;
using System.Collections.Generic;
var groups = new List<int[]> { new[] {1, 2}, new[] {3, 4} };
var flat = groups.SelectMany(g => g);
Console.WriteLine(string.Join(", ", flat));射影も遅延実行される
Select も遅延実行モデルを使用します。変換用のラムダ式は、シーケンスを列挙したときにだけ実行されます。
そのため、射影を構築するだけなら負荷は小さく、実際の処理は結果を反復または具体化するときに行われます。
using System;
using System.Linq;
int runs = 0;
int[] nums = { 1, 2, 3 };
var q = nums.Select(n => { runs++; return n; });
Console.WriteLine($"Before: {runs}");
foreach (var _ in q) { }
Console.WriteLine($"After: {runs}");フィルタリングしてから射影する
明確さと効率のためには、処理の順序が重要です。まず Where でフィルタリングし、その後 Select で射影してください。これにより、残す要素だけを変換できます。
このパイプラインは上から下へ読みやすく、不要な射影処理も避けられます。
using System;
using System.Linq;
int[] nums = { 1, 2, 3, 4, 5, 6 };
var result = nums.Where(n => n % 2 == 0)
.Select(n => n * n);
Console.WriteLine(string.Join(", ", result));新しいレコードに射影する
匿名型の代わりに、名前付きの型や record に射影することもできます。匿名型には既知の名前がないため、メソッドの境界をまたいで結果を渡す場合に便利です。
これにより、より豊富なドメインオブジェクトから DTO を作成することもできます。
using System;
using System.Linq;
using System.Collections.Generic;
record User(string Name, int Age);
record Summary(string Name);
var users = new List<User> { new("Ana", 30) };
var dtos = users.Select(u => new Summary(u.Name));
foreach (var d in dtos) Console.WriteLine(d.Name);Selectは順序と要素数を維持する
Where とは異なり、Select が要素を追加したり削除したりすることはありません。1対1で変換するため、出力の要素数と順序は入力と同じです。
要素数を減らしたい場合はフィルタリングし、各要素からより多くの要素を得たい場合は SelectMany を使ってください。
using System;
using System.Linq;
int[] nums = { 5, 1, 9 };
var doubled = nums.Select(n => n * 2);
Console.WriteLine($"In:{nums.Length} Out:{doubled.Count()}");理解度チェック
目的に合った演算子を選びましょう。
まとめ
Select は各要素をプロパティ、文字列、匿名型、レコードなどの新しい形に射影し、要素数と順序を1対1で維持します。インデックスを取得するオーバーロードがあり、遅延実行されます。
SelectMany はネストされたシーケンスを平坦化します。次は、形を整えたデータを並べ替えてグループ化します。
よくある質問
「SelectとProjection」レッスンは無料ですか?
はい。「SelectとProjection」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。
「SelectとProjection」で何を学びますか?
データを新しい形に整えます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「SelectとProjection」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Whereとフィルタリング
- SelectとProjection
- OrderByとグループ化
- 集計とToList