Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将列表拆分为多个部分-VB转换失败_.net_Vb.net_C# To Vb.net - Fatal编程技术网

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

.net 将列表拆分为多个部分-VB转换失败,.net,vb.net,c#-to-vb.net,.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 / 1000

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

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
我使用的是来自的C解决方案。 C溶液很好用

我用VB编写的版本返回一个列表集合,其中包含一个元素,而不是10000个元素。 我哪里出错了

提前谢谢

编辑1:

用法:

Dim chunks As List(Of List(Of String)) = SplitIdsIntoChunks(keys)
“关键点”内容:

My方法返回一个列表列表,其中包含一项:


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

在链接答案中,第一个选择如下

.Select((x, i) => new { Index = i, Value = x })
您的代码中有

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

为什么要重复键,我想您只需要指定匿名类型的属性就可以了。主要的“问题”是,在c中,用int除以int,x.Index/3,结果是一个整数。VB中的标准划分/总是导致双精度,因此每个项目都有一个唯一的组。e、 g.:{.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个项目 拆分3有100个项目


注意,在链接的C帖子上有很多关于各种方法性能的评论。这只是让它工作,一些替代方案可能会表现更好,这取决于实际被分割的内容。代码也很有趣。

该代码的正确翻译为:

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

注意返回浮点和返回整数之间的区别。

从这一点听上去,C中的每个属性都是键?看起来VB和C在这方面有些不同。C代码创建了一个匿名类型,有两个属性索引和值,为什么需要键入VB代码。不起作用?你能把你使用的代码和错误信息贴出来吗。在VB代码中不需要任何键,使用{Key.Index=i,Key.Value=x}创建一个具有两个属性Index和Value的匿名类型。在处理匿名类型时,始终使用关键字实际上是一种很好的做法,因为这样可以更容易地分析类型的行为。我从来没有在VB代码中使用过它…我总是使用new和{.PropA=x,.PropB=y}一起使用,就像在C new中一样{PropA=x,PropB=y}。我不明白为什么我需要钥匙[关键字]在那里。有人可以解释或重定向我的搜索来理解这个问题吗?举个例子,看看这个问题:即使在这种情况下可能不需要有人回答你的问题,你能在VB.NET中发布你所做的吗?我主要是这样说的,因为您已经提到了您遇到的一个特定错误,所以它可能会稍微修饰一下问题,以便添加到中。可能的重复