次の方法で共有


データのパーティション分割 (C#)

LINQ におけるパーティション分割とは、要素を並べ替えずに入力シーケンスを 2 つのセクションに分割し、それらのセクションの 1 つを返す操作を指します。

重要

これらのサンプルでは、System.Collections.Generic.IEnumerable<T> データ ソースを使用します。 System.Linq.IQueryProvider に基づくデータ ソースでは、System.Linq.IQueryable<T> データ ソースと式ツリーが使用されます。 式ツリーには、許可される C# 構文に制限があります。 さらに、EF Core などの各 IQueryProvider データ ソースでは、より多くの制限が課される場合があります。 ご利用のデータ ソースのドキュメントをご覧ください。

次の図は、文字のシーケンスに対して 3 つの異なるパーティション分割操作を実行した結果を示しています。 最初の操作では、シーケンスの最初の 3 つの要素が返されます。 2 番目の操作では、最初の 3 つの要素がスキップされ、残りの要素が返されます。 3 番目の操作では、シーケンスの最初の 2 つの要素がスキップされ、次の 3 つの要素が返されます。

LINQ のパーティション操作を示す図。

次のセクションに、シーケンスのパーティション分割を実行する標準クエリ演算子メソッドの一覧を示します。

演算子

メソッド名 説明 C# のクエリ式の構文 説明を見る
Skip シーケンス内の指定した位置まで要素をスキップします。 該当なし。 Enumerable.Skip
Queryable.Skip
SkipWhile 述語関数に基づき、条件を満たさない要素が出現する位置まで要素をスキップします。 該当なし。 Enumerable.SkipWhile
Queryable.SkipWhile
Take シーケンス内の指定した位置までの要素を取得します。 該当なし。 Enumerable.Take
Queryable.Take
TakeWhile 述語関数に基づき、条件を満たさない要素が出現する位置までの要素を取得します。 該当なし。 Enumerable.TakeWhile
Queryable.TakeWhile
チャンク シーケンスの要素を、指定された最大サイズのチャンクに分割します。 該当なし。 Enumerable.Chunk
Queryable.Chunk

以下の例はすべて、Enumerable.Range(Int32, Int32) を使用して 0 から 7 までの数値のシーケンスを生成します。

シーケンス内の最初の要素のみを取得するには、Take メソッドを使用します。

foreach (int number in Enumerable.Range(0, 8).Take(3))
{
    Console.WriteLine(number);
}
// This code produces the following output:
// 0
// 1
// 2

シーケンス内の最初の要素をスキップし、残りの要素を使用するには、Skip メソッドを使用します。

foreach (int number in Enumerable.Range(0, 8).Skip(3))
{
    Console.WriteLine(number);
}
// This code produces the following output:
// 3
// 4
// 5
// 6
// 7

TakeWhile および SkipWhile メソッドも、シーケンス内の要素を取得およびスキップします。 ただし、これらのメソッドは、設定された数の要素ではなく、条件に基づいて要素をスキップまたは取得します。 TakeWhile は、条件が一致しない要素が出現するまでシーケンスの要素を取得します。

foreach (int number in Enumerable.Range(0, 8).TakeWhile(n => n < 5))
{
    Console.WriteLine(number);
}
// This code produces the following output:
// 0
// 1
// 2
// 3
// 4

SkipWhile は、条件が true である限り、最初の要素をスキップします。 条件を満たさない最初の要素と、それ以降のすべての要素が返されます。

foreach (int number in Enumerable.Range(0, 8).SkipWhile(n => n < 5))
{
    Console.WriteLine(number);
}
// This code produces the following output:
// 5
// 6
// 7

Chunk 演算子を使用して、シーケンスの要素を特定の size に基づいて分割します。

int chunkNumber = 1;
foreach (int[] chunk in Enumerable.Range(0, 8).Chunk(3))
{
    Console.WriteLine($"Chunk {chunkNumber++}:");
    foreach (int item in chunk)
    {
        Console.WriteLine($"    {item}");
    }

    Console.WriteLine();
}
// This code produces the following output:
// Chunk 1:
//    0
//    1
//    2
//
//Chunk 2:
//    3
//    4
//    5
//
//Chunk 3:
//    6
//    7

前述の C# コードでは、次のことが行われます。

  • Enumerable.Range(Int32, Int32) に依存して、一連の数値を生成します。
  • Chunk 演算子を適用し、最大サイズを 3 としてシーケンスをチャンクに分割します。

関連項目