vb.net - 有效地将列表划分为固定大小的 block

标签 vb.net algorithm partitioning

我真的很喜欢 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 的东西才能按需生成结果?

最佳答案

这可能是一种变通方法。将子例程设为 Sub 并传入目标列表。现在您可以直接将子列表添加到其中,而无需先创建整个中间对象。

Dim testlist As New List(Of List(Of Integer))
Partition(Of Integer)({1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, 4, testlist)

Public Sub Partition(Of T)(source As IEnumerable(Of T), size As Integer, ByRef input As List(Of List(Of T)))
    If source Is Nothing Then
        Throw New ArgumentNullException("list")
    End If
    If size < 1 Then
        Throw New ArgumentOutOfRangeException("size")
    End If
    For i = 0 To source.Count - 1 Step size
        input.Add(source.Skip(i).Take(size).ToList())
    Next
End Sub

关于vb.net - 有效地将列表划分为固定大小的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20556678/

相关文章:

c# - 如何在时间跨度内进行除法

python - 谷歌 foobar gearing_up_for_destruction

mysql - 使用 MySQL 按空值分区

mysql - 如何在此表上使用 MySQL 表分区?

hadoop - 从 MapReduce 作业向 Hive 添加分区

c# - 使用 Javascript 折叠 RadFileExplorer

VB.Net 扩展对象 IExtenderProvider

javascript - 在 javascript 的 case 语句中添加后端函数调用会导致速度显着下降

algorithm - 币密集软处理舍入误差的常用策略?

python - 在包含可能子序列列表的列表中查找可能回文字符串的算法