Gho*_*ter 4 .net vb.net c#-to-vb.net
尝试编写一个将列表拆分为子列表的方法.
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
Run Code Online (Sandbox Code Playgroud)
我从这里使用了C#解决方案.C#解决方案工作正常.
我用VB编写的版本返回一个列表的集合,其中包含一个元素而不是10000.我哪里出错了?
提前致谢.
编辑1:
用法:
Dim chunks As List(Of List(Of String)) = SplitIdsIntoChunks(keys)
Run Code Online (Sandbox Code Playgroud)
'钥匙'内容:

我的方法返回一个列表,其中包含一个项目:

预期结果:两个列表的列表 - 首先是10000个项目,第二个是6256个.
主要的"问题"是在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
Run Code Online (Sandbox Code Playgroud)
另一个区别是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
Run Code Online (Sandbox Code Playgroud)
输出/结果:
Split 0有300件商品
Split 1有300件商品
Split 2有300件商品
Splits 3有100件商品
请注意,链接C#帖子上有很多关于各种方法性能的评论.这只是让它工作,一些替代方案可能会更好地执行,具体取决于实际拆分的内容.在Skip和Take这里使用的方法很有趣了.
| 归档时间: |
|
| 查看次数: |
2682 次 |
| 最近记录: |