次の方法で共有


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

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

Von Bedeutung

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

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

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

次のセクションでは、パーティション シーケンスの標準クエリ演算子メソッドを示します。

オペレーター

メソッド名 説明 C# クエリ式の構文 詳細情報
スキップ シーケンス内の指定した位置まで要素をスキップします。 適用されません。 Enumerable.Skip
Queryable.Skip
SkipWhile 要素が条件を満たさないまで、述語関数に基づいて要素をスキップします。 適用されません。 Enumerable.SkipWhile
Queryable.SkipWhile
取る シーケンス内の指定した位置まで要素を受け取ります。 適用されません。 Enumerable.Take
Queryable.Take
テイクホワイル 要素が条件を満たさないまで、述語関数に基づいて要素を受け取ります。 適用されません。 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 のチャンクにシーケンスを分割します。

こちらも参照ください