如何通过 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 将集合拆成多个块?相关推荐
- 集合拆成固定长度的小集合_《集合啦动物森友会》钓鱼怎么玩?钓鱼小技巧攻略分享...
<集合啦动物森友会>中钓鱼需要一定的技巧,在甩竿的时候必须把鱼饵甩到鱼能看的位置,并且还不能惊动其他的鱼,下面带来由"九幽荒翎"分享的<集合啦动物森友会>钓 ...
- 请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合?...
请拆招:将两个已排序集合分解成两个独立部分的集合和一个共有部分的集合? 请看下面的代码. using System; using System.Collections.Generic; namespa ...
- 技术图文:如何通过 LINQ 查找集合中的重复数据?
背景 在前几天介绍的 如何利用C#实现Huffman编码? 的图文中有以下代码. private List<HuffmanTreeNode> CreateInitForest(string ...
- 拆数,给定两个正整数m,n(m = n),将m拆成n个数相加...(游戏)
1. 问题 (网上看到的题目) 昨天去面试人家出了这样一道题,觉得挺简单的,但就是编不出来,只好麻烦各位高手了. 给定两个正整数m,n(m >= n),将m拆成n个数相加:m =a(1)+a(2 ...
- 字符串 拼接方法,公司内部的方法,用集合转换成拼接的字符串
<pre name="code" class="java"> nameSum += StringUtils.isEmpty(nameSum)?nam ...
- java 泛型集合 json_将泛型集合转换成分页json数据
[java]代码库package com.sunweb.util.jsonfactory; import java.util.List; import com.sunweb.util.jsonfact ...
- 将对象集合包装成JSON格式
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import ...
- python 数组转音频_Python3+将2声道音频,分拆成1声道
现在是将双声道的音频分拆成单声道的. 同理可以将多声道的音频文件,转为1声道的音频文件. 注意新形成的音频文件的rate,需要与原音频的相同. import os import wave import ...
- 多个集合合并成没有交集的集合-实现
1.问题描述 将多个集合合并成没有交集的集合. 给定一个字符串的集合,格式如:{aaa bbb ccc}, {bbb ddd},{eee fff},{ggg},{ddd hhh}要求将其中交集不为空的 ...
最新文章
- 云服务器 小学生_日本小学生羡慕中国学生“钉”选之子,马云实现了他们的愿望...
- 网络管理的任务包括linux,网络管理员的任务是阻止的10.152.8.0/21 一个基于Linux的防火墙的网络子网的默认端口上的所有出站SSH 连接。以下哪项规则集将完成这项任务?(单选题)...
- php array_reduce 降维,使用array_reduce降维
- iptables转发基础
- [HNOI2016]序列(莫队,RMQ)
- exfat linux 驱动_「正点原子Linux连载」第二章Ubuntu系统入门(2)
- 阿里、腾讯双双辟谣:云计算魅力彰显
- rhadoop之mapreduce函数
- CSS常见面试题(持续更新)
- 记录一次阿里云Mysql 数据库恢复 qp.xb文件恢复数据
- IE浏览器主页被劫持,如何解决主页被篡改问题?
- 数学建模(NO.7相关系数—假设检验)
- Intel D435深度相机“No Frames Received!“问题
- java中getTime()
- 50个有趣的休闲网站 (外国)
- Pytorch 的repeat函数
- 南京大学考研招生目录、分数线、参考书
- vSphere 6.7 U3部署win11
- 第11篇- 抓取免费代理IP并搭建自己的代理IP池
- symbian与uiq开发教程[完整版]
热门文章
- 安卓加载asset中的json文件_Android解析Asset目录下的json文件
- python中o_Python I/O与进程的详细讲解
- c++万能头文件_初学Python,与C对比
- android通过代码设置铃声_第六十四回:Android中UI控件之SeekBar
- Discrete Log Algorithms :Baby-step giant-step
- Button的设置及各种属性
- 6款程序员不得不爱的bootstrap模板
- ionic 中文 API CSS and javascript link
- 【ACM】nyoj_305_表达式求值_201308081018
- 《Starting with Starling》 Ep 1~11