Vb.net 如何将对象数组拆分为给定大小的多个子数组

Vb.net 如何将对象数组拆分为给定大小的多个子数组,vb.net,linq,Vb.net,Linq,我想将一个对象数组拆分为包含不超过10个元素的多个数组 我花了很长时间研究示例,我能找到的最接近的示例是C: Enumerable.Range(0, 100).Select((Value, Index) => new {Value, Index}) .GroupBy(p => p.Index/10) .Select(g => g.Select(p => p.Value).ToList()) 这在LinqPad中运行并工作,因此我尝试将其转换为VB.Net

我想将一个对象数组拆分为包含不超过10个元素的多个数组

我花了很长时间研究示例,我能找到的最接近的示例是C:

Enumerable.Range(0, 100).Select((Value, Index) => new {Value, Index})
    .GroupBy(p => p.Index/10)
    .Select(g => g.Select(p => p.Value).ToList())
这在LinqPad中运行并工作,因此我尝试将其转换为VB.Net:

Enumerable.Range(0, 100).Select(Function(Value, Index) New With {Value, Index}) _
    .GroupBy(Function(x) x.Index / 10) _
    .Select(Function(g) g.Select(Function(p) p.Value).ToList())
但这并没有给出相同的结果,尽管看起来应该如此


显然,这只是一个示例,我真的希望它能够处理一系列自定义对象。优点:为什么这两个示例不相等?

在C中,您有整数除法,这意味着小数点被截断,结果也是一个整数。这就是为什么它在C中有效,而在VB.NET中无效,VB.NET将小数点转换为双精度

如果希望在VB.NET中具有相同的行为,则需要使用\而不是/

见:


其他明智的做法是尝试下面的方法

        int currentPosition = 0;
        int maxArrayLimit = 10;

        //Total values 0-103
        List<int> lstNumbers = Enumerable.Range(0, 103).Select(x => x).ToList<int>();

        //to hold splited values 
        List<List<int>> lstSplitedNumbers = new List<List<int>>();

        while (currentPosition < lstNumbers.Count)
        {
            //spliting values based on currentPosition to maxArrayLimit
            List<int> lstCurrentNumbers = lstNumbers.Skip(currentPosition).Take(maxArrayLimit).ToList<int>();
            lstSplitedNumbers.Add(lstCurrentNumbers);
            //rest the current position
            currentPosition += lstCurrentNumbers.Count;
        }

但这并没有给出相同的结果:那么,它给出了什么?它有什么不同?我的猜测从VB开始已经有很长一段时间了:除法的结果是双倍而不是整数?结果相当大,所以我没有包括它们以避免混乱。。。它给出了100个数组,每个数组中有一个项,如果你看一下组键,你应该会看到,从当前发布的答案判断,这些答案支持我的直觉,即键都是双精度/浮点数,而不是整数。调试并查看实际结果,将其与预期结果进行比较,应该可以避免您发布此问题-您如何看待组键,我是linq新手,另外,您如何调试linq?我还没有解决这个问题。。。这更像是一种“运行它并找出答案”的方法。这不太好。。。你的建议是什么?选择。。。GroupBy从GroupBy结果中剥离键之后,最简单的方法可能是将中间结果存储在一个变量中,然后首先查看foo=Enumerable….GroupBy…,然后使用调试器检查foo。谢谢,但我正在寻找linq示例。
        int currentPosition = 0;
        int maxArrayLimit = 10;

        //Total values 0-103
        List<int> lstNumbers = Enumerable.Range(0, 103).Select(x => x).ToList<int>();

        //to hold splited values 
        List<List<int>> lstSplitedNumbers = new List<List<int>>();

        while (currentPosition < lstNumbers.Count)
        {
            //spliting values based on currentPosition to maxArrayLimit
            List<int> lstCurrentNumbers = lstNumbers.Skip(currentPosition).Take(maxArrayLimit).ToList<int>();
            lstSplitedNumbers.Add(lstCurrentNumbers);
            //rest the current position
            currentPosition += lstCurrentNumbers.Count;
        }