0Pricing
C# Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Whereとフィルタリング
  2. SelectとProjection
  3. OrderByとグループ化
  4. 集計とToList
← C# Academyに戻る