如何通过 Linq 将集合拆成多个块?
生活随笔
收集整理的這篇文章主要介紹了
如何通过 Linq 将集合拆成多个块?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
BlakeH:
請問是否可以用 linq 按序生成帶有多個固定 size 的塊?我的理想情況下還可以對這些 塊 進行操作。
回答區
Sergey Berezovskiy:
說實話,你不需要寫任何代碼,使用 MoreLINQ 中的批次方法即可,它可以按序拆解到固定大小的桶中,你可以直接在 Nuget 上安裝 MoreLINQ 包。
int?size?=?10; var?batches?=?sequence.Batch(size);如果你好奇它的實現方法,可參考如下源碼:
public?static?IEnumerable<IEnumerable<TSource>>?Batch<TSource>(this?IEnumerable<TSource>?source,?int?size) {TSource[]?bucket?=?null;var?count?=?0;foreach?(var?item?in?source){if?(bucket?==?null)bucket?=?new?TSource[size];bucket[count++]?=?item;if?(count?!=?size)continue;yield?return?bucket;bucket?=?null;count?=?0;}if?(bucket?!=?null?&&?count?>?0)yield?return?bucket.Take(count).ToArray(); }dana:
這個需求確實比較常見,在 .NET6 中添加了一個 Enumerable.Chunk() 擴展方法,然后你就可以像下面這樣使用。
var?list?=?new?List<int>?{?1,?2,?3,?4,?5,?6,?7?};var?chunks?=?list.Chunk(3); //?returns?{?{?1,?2,?3?},?{?4,?5,?6?},?{?7?}?}如果你對源碼感興趣,可以參考如下:
public?static?IEnumerable<TSource[]>?Chunk<TSource>(this?IEnumerable<TSource>?source,?int?size) {if?(source?==?null){ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);}if?(size?<?1){ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.size);}return?ChunkIterator(source,?size); }private?static?IEnumerable<TSource[]>?ChunkIterator<TSource>(IEnumerable<TSource>?source,?int?size) {using?IEnumerator<TSource>?e?=?source.GetEnumerator();while?(e.MoveNext()){TSource[]?array?=?new?TSource[size];array[0]?=?e.Current;int?i;for?(i?=?1;?i?<?array.Length;?i++){if?(!e.MoveNext()){break;}array[i]?=?e.Current;}if?(i?==?array.Length){yield?return?array;continue;}Array.Resize(ref?array,?i);yield?return?array;break;} }點評區
發現 .NET6 下的 Enumerable 增加了一些 By 系列方法:MinBy,ExceptBy,IntersectBy,又有得學了。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的如何通过 Linq 将集合拆成多个块?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET GC 实时监控工具 dotne
- 下一篇: HTTP1.1 Keep-Alive到底