如何对可枚举进行分块?

2023-12-19

我需要一种优雅的方法,它接受一个可枚举值,并获取可枚举值的可枚举值,其中每个元素的数量相同,但最后一个是:

public static IEnumerable<IEnumerable<TValue>> Chunk<TValue>(this IEnumerable<TValue> values, Int32 chunkSize)
{
    // TODO: code that chunks
}

这是我尝试过的:

    public static IEnumerable<IEnumerable<TValue>> Chunk<TValue>(this IEnumerable<TValue> values, Int32 chunkSize)
    {
        var count = values.Count();
        var numberOfFullChunks = count / chunkSize;
        var lastChunkSize = count % chunkSize;
        for (var chunkIndex = 0; chunkSize < numberOfFullChunks; chunkSize++)
        {
            yield return values.Skip(chunkSize * chunkIndex).Take(chunkSize);
        }
        if (lastChunkSize > 0)
        {
            yield return values.Skip(chunkSize * count).Take(lastChunkSize);
        }
    }

UPDATE刚刚发现有一个类似的关于拆分列表的主题使用 LINQ 将列表拆分为子列表 https://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq


如果内存消耗不是问题,那么像这样?

static class Ex
{
    public static IEnumerable<IEnumerable<TValue>> Chunk<TValue>(
        this IEnumerable<TValue> values, 
        int chunkSize)
    {
        return values
               .Select((v, i) => new {v, groupIndex = i / chunkSize})
               .GroupBy(x => x.groupIndex)
               .Select(g => g.Select(x => x.v));
    }
}

否则你可以发挥创意yield关键字,像这样:

static class Ex
{
    public static IEnumerable<IEnumerable<TValue>> Chunk<TValue>(
                    this IEnumerable<TValue> values, 
                    int chunkSize)
    {
        using(var enumerator = values.GetEnumerator())
        {
            while(enumerator.MoveNext())
            {
                yield return GetChunk(enumerator, chunkSize).ToList();
            }
        }
    }

    private static IEnumerable<T> GetChunk<T>(
                     IEnumerator<T> enumerator,
                     int chunkSize)
    {
        do
        {
            yield return enumerator.Current;
        } while(--chunkSize > 0 && enumerator.MoveNext());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对可枚举进行分块? 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 我应该在关闭资源解析器之前关闭会话吗

    我有简单的服务 让我们使用 resourcesResolver 和 session 来实现一些逻辑 Component immediate true Service value ServiceInterface class public c
  • 在 RecyclerView 中垂直居中所选项目

    我正在尝试为我的应用程序实现某种轮式选择器 因为当前选项依赖于自定义Views或旧的ListView 所以我想将我的解决方案基于RecyclerView 到目前为止我所做的就是在开始和结束时设置RecyclerView two View具有
  • ajax 调用后使用 PHP 重定向

    我正在执行以下 ajax 调用 save sale click function var save sale 1 ajax type GET url summary php data save sale save sale success
  • 本地分支的文件存储在哪里

    今天我遇到了一件有趣的事情 这让我想知道 git 如何处理本地分支 所以我在我的存储库上遇到了一些问题 删除了本地文件夹 它进入了回收站 并重新克隆 也许极端 在我这样做之后 我意识到我删除了一个我从未推送过的本地分支 因为它是一个个人项目
  • Spring MVC 的 ehcache 或 spring 缓存中的最佳缓存实践是什么?

    计划在基于 Spring Web 的应用程序中实现静态数据的缓存机制 谁能解释一下哪种是最好的以及它是如何工作的 EhCache 弹簧缓存 免责声明 我是兵马俑 Software AG http www terracotta org员工 E
  • Ruby 中的全局方法 [重复]

    这个问题在这里已经有答案了 如果 Ruby 中的所有 函数 都是方法 那么当我调用方法而没有明确提及调用它们的对象时 它们会发送给谁 Ruby 编程语言一书 Flanagan Matsumoto 说 如果省略对象 则在 self 上调用该方
  • 在 Rust 中调用存储在结构体中的堆栈分配闭包

    我将闭包存储在如下结构中 derive Clone struct S lt a gt func a FnOnce gt u32 fn main let s S func 0 let val s func println val 当我编译时
  • 正则表达式检查新行

    我想检查 if 语句是否在一行或下一行而不带大括号 如下所示 if blah blah do something or if foo foo do something 我目前拥有的正则表达式是 但不起作用 有人有主意吗 详细说明此正则表达式
  • 动态行值错误地更新到 mysql php

    在这里 我尝试使用 php 编辑和更新我的动态行值 这是我的 edit php 页面编码 它完美地从 mysql 获取动态行数据 uid int GET id tariff query mysql query SELECT FROM ebv
  • 如何在对象上使用 ES6 哈希映射而不维护引用(在 Java 哈希码中)

    我一直在 io js 中尝试 ES6 Map 并意识到我不能执行以下操作 var map new Map map set key value some string map get key value undefined I want so
  • 从 eclipse 调试 Ant 任务

    我正在 eclipse ide 中使用 java 开发自定义 ant 任务 是否有可能以某种方式调试它 那是在java行上放置一个断点 当执行ant时 它会停在那里 我可以单步执行代码吗 编辑 由于这个问题已作为重复问题关闭 我想详细说明为
  • 通过ajax传递数据安全吗?

    我创建了脚本 它将使用此命令计算某些特定 div 的子级 div content children size 通过这个计数 如果这个计数是 12 我知道从 mysql 获取 12 到 18 使用firebug 我可以找到这个计数 它将发布到
  • 如何仅为django中的某些路径定义中间件?

    无论如何 有没有为 django 中的特定路由或路由组定义中间件 就像 laravel 一样 我们可以将其定义如下 Route get admin profile function gt middleware auth 从历史上看 您可以利
  • NightmareJS截图回调

    我正在使用这个框架来制作几个网址的屏幕截图 截图的过程是异步的 并且该方法没有提供执行回调的方法 我想在这个脚本上每次截图时执行回调 nightmare new Nightmare urls forEach function url nig
  • 使用 xml 属性创建 XML 结构

    我正在尝试解决 xml 属性的难题 问题是我们已经广泛使用了具有这种结构的文件 我不能偏离它
  • $PATH 相对于别名的优势

    我对 Linux 和 Unix 比较陌生 在互联网的帮助下我终于弄清楚了如何 PATH和我的别名 bashrc work 但我确实找不到任何描述何时使用哪个的内容 假设我在 Library Frameworks 中安装了 Python3 3
  • 两个函数使用类型注释进行编译。删除一个注释 - 无法编译。删除两个 - 再次编译。为什么?

    注意这个反射计划 LANGUAGE ScopedTypeVariables RecursiveDo import Control Applicative import Control Monad import Control Monad I
  • 使用遮罩从图像中裁剪字母

    我需要的 1 从图库或相机中选择图像 2 书写和文字 3 文本与图像一起裁剪 下图可以更清楚地说明我到底需要什么 我知道图像的遮蔽和裁剪 即使我用框架进行了遮蔽表情符号我的应用程序 http www youtube com watch v
  • wp_enqueue_script() 和 wp_register_script() 之间有什么区别

    我不清楚我将在何时何地使用wp enqueue script or wp register script 简单来说 wp enqueue script means 添加到队列中以注册文件 wp register script means 立
  • 如何对可枚举进行分块?

    我需要一种优雅的方法 它接受一个可枚举值 并获取可枚举值的可枚举值 其中每个元素的数量相同 但最后一个是 public static IEnumerable