尝试编写一个将列表拆分为子列表的方法。
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编写的版本返回一个列表集合,其中包含一个元素而不是10000。 我哪里出错了?
提前致谢。
修改1:
用法:
Dim chunks As List(Of List(Of String)) = SplitIdsIntoChunks(keys)
'键'含量:
我的方法返回一个列表,其中包含一个项目:
预期结果:两个列表的列表 - 首先是10000个项目,第二个是6256个。
答案 0 :(得分:8)
主要问题'是在c#中将int除以int x.Index / 3
,得到一个整数。 VB中的标准分部/
始终生成Double
,因此每个项目都有一个唯一的组。例如:{。33,.333333,.333334}等。
'''是使用整数除法\
来获得整数结果。我还添加了一个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以来)支持隐式行继续 之后的很多事情,包括成员限定符(点.
),这样你就可以摆脱显式的行继续(" _"
)。
用法:
' 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
输出/结果:
拆分0有300件商品
Split 1有300件商品
Split 2有300件商品
Splits 3有100个项目
请注意,链接C#帖子中有很多关于各种方法性能的评论。这只是让它工作,一些替代方案可能会更好地执行,具体取决于实际拆分的内容。 Skip
and Take
approach used here也很有趣。
答案 1 :(得分:2)
该代码的正确翻译是:
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
答案 2 :(得分:-1)
在链接的答案中,First Select就像这样
.Select((x, i) => new { Index = i, Value = x })
您的代码中有
.Select(Function(x, i) New With {Key .Index = i, Key .Value = x})
为什么你重复Key,我认为你只需要指定匿名类型的属性