為 IEnumerableT 構建自己的 Linq 運算子

Linq 的一大優點是它易於擴充套件。你只需要建立一個引數為 IEnumerable<T>擴充套件方法

public namespace MyNamespace
{
    public static class LinqExtensions
    {
        public static IEnumerable<List<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
        {
            var batch = new List<T>();
            foreach (T item in source)
            {
                batch.Add(item);
                if (batch.Count == batchSize)
                {
                    yield return batch;
                    batch = new List<T>();
                }
            }
            if (batch.Count > 0)
                yield return batch;
        }
    }
}

此示例將 IEnumerable<T> 中的專案拆分為固定大小的列表,最後一個列表包含其餘專案。注意使用 this 關鍵字如何將應用擴充套件方法的物件作為初始引數傳入(引數 source)。然後 yield 關鍵字用於在繼續從該點執行之前輸出輸出 IEnumerable<T> 中的下一個專案(請參閱 yield 關鍵字 )。

此示例將在你的程式碼中使用,如下所示:

//using MyNamespace;
var items = new List<int> { 2, 3, 4, 5, 6 };
foreach (List<int> sublist in items.Batch(3))
{
    // do something
}

在第一個迴圈中,子列表將是 {2, 3, 4},而在第二個 {5, 6} 上。

自定義 LinQ 方法也可以與標準 LinQ 方法結合使用。例如:

//using MyNamespace;
var result = Enumerable.Range(0, 13)         // generate a list
                       .Where(x => x%2 == 0) // filter the list or do something other
                       .Batch(3)             // call our extension method
                       .ToList()             // call other standard methods

此查詢將返回批量分組的偶數,大小為 3:{0, 2, 4}, {6, 8, 10}, {12}

請記住,你需要 using MyNamespace; 行才能訪問擴充套件方法。