分割資料 (C#)
LINQ 中的分割是指將輸入序列分成兩個區段的作業,不用重新排列項目,然後傳回其中一個區段。
重要
這些範例會使用 System.Collections.Generic.IEnumerable<T> 資料來源。 根據 System.Linq.IQueryProvider 的資料來源會使用 System.Linq.IQueryable<T> 資料來源和運算式樹狀架構。 運算式樹狀架構在允許的 C# 語法方面有限制。 此外,每個 IQueryProvider
資料來源 (例如 EF Core) 可能會施加更多限制。 檢查資料來源的文件。
下圖顯示字元序列三種不同分割作業的結果。 第一項作業會傳回序列中的前三個項目。 第二項作業會略過前三個項目,傳回其餘項目。 第三個作業會略過序列中的前兩個項目,傳回接下來的三個元項目。
分割序列的標準查詢運算子方法詳列於下一節。
操作員
方法名稱 | 描述 | C# 查詢運算式語法 | 其他相關資訊 |
---|---|---|---|
跳過 | 略過項目直至序列中指定的位置為止。 | 不適用。 | 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
只要條件為 true,SkipWhile
就會跳過第一個元素。 不符合條件的第一個元素和所有後續元素皆會傳回。
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
運算子,將序列分割成大小上限為三的區塊。