将列表拆分为多个部分 - VB 转换失败

Split a List into parts - VB conversion fails

正在尝试编写将列表拆分为子列表的方法。

Private Function SplitIdsIntoChunks(ByVal keys As List(Of String)) As List(Of List(Of String))
    Return keys _
        .Select(Function(x, i) New With {Key .Index = i, Key .Value = x}) _
        .GroupBy(Function(x) (x.Index / 10000)) _
        .Select(Function(x) x.Select(Function(v) v.Value).ToList()) _
        .ToList()
End Function

我使用了 here 中的 C# 解决方案。 C# 解决方案工作正常。

我的版本是用 VB returns 一个列表的集合编写的,而不是 10000 个元素。 我哪里错了?

提前致谢。

编辑 1:

用法:

Dim chunks As List(Of List(Of String)) = SplitIdsIntoChunks(keys)

'Keys'内容:

我的方法returns一个包含一个项目的列表列表:

预期结果:两个列表的列表 - 第一个 10000 项,第二个 6256 个。

在链接的答案中,第一个 Select 是这样的

.Select((x, i) => new { Index = i, Value = x })

您的代码中有

.Select(Function(x, i) New With {Key .Index = i, Key .Value = x})

为什么要重复Key,我觉得你只要指定匿名类型的Properties就可以了

主要的 'problem' 是在 c# 中将一个 int 除以一个 int,x.Index / 3,得到一个整数。 VB 中的标准除法 / 总是会产生 Double,因此每个项目都有一个唯一的组。例如:{.33, .333333, .333334} 等

'trick'是用整数除法\得到一个整数结果。我还添加了一个 chunksize 参数以使其更加灵活和可重用:

Private Function SplitIntoChunks(keys As List(Of String), chunkSize As Integer) As List(Of List(Of String))
    Return keys.
            Select(Function(x, i) New With {Key .Index = i, Key .Value = x}).
            GroupBy(Function(x) (x.Index \ chunkSize)).
            Select(Function(x) x.Select(Function(v) v.Value).ToList()).
            ToList()
End Function

另一个区别是c#对于行的延续非常灵活,所以点可以在一行的开头或结尾。 VB(自 VS2010 起)支持隐式续行 after 很多东西,包括成员限定符(点 .),因此您可以摆脱显式行延续 (" _").

用法:

' split list of 1000 into 300 chunks
Dim splits = SplitIntoChunks(myList, 300)

For n As Integer = 0 To splits.Count - 1
    Console.WriteLine("Split {0} has {1} items", n.ToString(), splits(n).Count)
Next

Output/Result:

Split 0 has 300 items
Split 1 has 300 items
Split 2 has 300 items
Splits 3 has 100 items

请注意,链接的 C# post 上有很多关于各种方法性能的评论。这只是让它工作,一些替代方案可能会根据实际拆分的内容表现得更好。 也很有趣。

该代码的正确翻译是:

Private Function SplitIdsIntoChunks(ByVal keys As List(Of String)) As List(Of List(Of String))
    Return keys _
        .Select(Function(x, i) New With {Key .Index = i, Key .Value = x}) _
        .GroupBy(Function(x) (x.Index \ 10000)) _
        .Select(Function(x) x.Select(Function(v) v.Value).ToList()) _
        .ToList()
End Function

注意 / (which returns a floating-point) and \ 之间的区别(returns 是一个整数)。