IEnumerable<T>パイプラインと遅延実行
IEnumerable に対するLINQパイプラインを構築し、ToList/ToArrayによる具体化と遅延実行の違いを確認します。
「IEnumerable<T>パイプラインと遅延実行」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。
LINQパイプラインの考え方
パイプライン = シーケンスを変換する演算子のチェーンです。
- ソース: IEnumerable<T>
- 演算子: Where、Select など
- シンク: 列挙(foreach)またはマテリアライズ(ToList)
Where + Select
Where、続いてSelectを使ってチェーンを作成します。反復処理するとクエリが実行されます。
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] numbers = new int[] { 1, 2, 3, 4, 5 };
// Build pipeline: keep even numbers, then square them
var query = numbers
.Where(n => n % 2 == 0)
.Select(n => n * n);
foreach (int x in query)
{
Console.WriteLine(x); // 4, 16
}
}
}
遅延実行の効果
遅延実行: クエリは列挙時に評価されるため、後からソースを変更すると、その変更が反映されます。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
List<int> data = new List<int>();
data.Add(1);
data.Add(2);
var evens = data.Where(x => x % 2 == 0); // query is not executed yet
data.Add(3);
data.Add(4); // modify source after building query
foreach (int e in evens)
{
Console.WriteLine(e); // prints 2 and 4 because execution is deferred
}
}
}
マテリアライズ(ToList)
ToList/ToArrayを使ってシーケンスを今すぐマテリアライズし、後からのソース変更を反映しないようにします。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
List<string> words = new List<string>();
words.Add("apple");
words.Add("banana");
var longOnes = words.Where(w => w.Length >= 6);
List<string> snapshot = longOnes.ToList(); // materialize now
words.Add("pear"); // changes after materialization
words.Add("cherry"); // length 6, but snapshot is already frozen
foreach (string w in snapshot)
{
Console.WriteLine(w); // prints "banana" only
}
}
}
OrderBy + Take
OrderBy、Select、Take/Skipを組み合わせて、小さく読みやすいパイプラインを作成します。
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] nums = new int[] { 5, 1, 4, 2, 3 };
var firstTwoSortedSquares = nums
.OrderBy(n => n) // 1,2,3,4,5
.Select(n => n * n)
.Take(2); // 1,4
foreach (int x in firstTwoSortedSquares)
{
Console.WriteLine(x);
}
}
}
ヒントと注意点
ヒント:
- クエリは計画を構築し、列挙またはマテリアライズしたときに実行されます。
- 安定したスナップショットが必要な場合は、ToListでマテリアライズします。
- 各ステップを小さくし、わかりやすい名前を付けます。
- 高コストなソースの再列挙を避け、必要ならリストに保存します。
遅延実行のルール
要約
要約: Where/Selectなどを使って小さなIEnumerable<T>パイプラインを構築します。実行は、反復処理するかToList/ToArrayを呼び出すまで遅延されることを忘れないでください。
よくある質問
「IEnumerable<T>パイプラインと遅延実行」レッスンは無料ですか?
はい。「IEnumerable<T>パイプラインと遅延実行」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。
「IEnumerable<T>パイプラインと遅延実行」で何を学びますか?
IEnumerable に対するLINQパイプラインを構築し、ToList/ToArrayによる具体化と遅延実行の違いを確認します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「IEnumerable<T>パイプラインと遅延実行」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- IEnumerable パイプラインと遅延実行
- Select、Where、OrderBy、Take/Skip
- クエリ構文とメソッド構文