【发布时间】:2013-12-19 01:17:02
【问题描述】:
我真的很喜欢下面显示的algorithm,用于将列表拆分为固定大小的子列表。它可能不是最一种有效的算法(编辑:根本)。
我想要在可读性、优雅和性能之间取得良好平衡的东西。问题是,我在 C# 中找到的大多数算法都需要 yield 关键字,如果您在 Visual Studio 2010 中使用 .NET 3.5,则该关键字不可用;)
public IEnumerable<IEnumerable<T>> Partition<T>(IEnumerable<T> source, int size)
{
if (source == null)
throw new ArgumentNullException("list");
if (size < 1)
throw new ArgumentOutOfRangeException("size");
int index = 1;
IEnumerable<T> partition = source.Take(size).AsEnumerable();
while (partition.Any())
{
yield return partition;
partition = source.Skip(index++ * size).Take(size).AsEnumerable();
}
}
我尝试在 VB 中重写它,但不得不使用第二个列表来收集结果,这最终比上面的实现花费了更多的时间。
我正在寻找可以在 VB.NET 中使用的另一种算法,但是大多数结果都遇到了必须将所有内容基本上加载到内存中而不是能够动态生成结果的问题a la python 中的生成器。这不是一个大问题,但不如yield return 那样理想。
在 VB.NET 中是否有一个好的推荐算法来执行此操作?我是否必须创建一些实现 IEnumerator 的东西才能按需生成结果?
【问题讨论】:
-
我相信 yield 是在 .NET 2.0 中引入的
-
Yield in VB.NET的可能重复
-
@MitchWheat 我不这么认为......至少在 VS2010 中它不在这个 list of VB keywords 中......
-
我指的是c#。对不起。
-
@JeffBridgman 我刚刚写了一篇关于分区方法和性能的博文。看看:Partitioning the collection using LINQ: different approaches, different performance, the same result。差别很大!
标签: vb.net algorithm partitioning