根据 c# 中的特定模式将数组拆分为较小的数组

本文关键字:数组 拆分 模式 根据 | 更新日期: 2023-09-27 18:30:39

我想将双精度值数组拆分为较小的数组块...例如,假设我有一个无限大小的数组测试 = { x0, x1, x2, x3, x4, x5, x6, x7,... } 我想将它们分成 3 个单独的数组,分别是 a={x0,x3,x6,x9,...}、b={x1,x4,x7,x10,..} 和 c={x2,x5,x8,x11,..}。

我尝试过,但它没有运行。.我不确定错误是什么?有没有更简单的方法可以做到这一点?

 class Program
{
    static void Main(string[] args)
    {
        double[] test = { 0.2, 1.4, 2.45, 3.66, 4.34, 5.8, 6.9, 7.56, 8.899, 9.232, 10.1, 11.1, 12.45,13.87,14.8,15.78};
        double[] array = double [0];
        double[] array1 = double [0];
        double[] array2 = double [0];
        for (int i = 0; i <= test.Length; i++)
        {
            for (int j = 0; j < test.Length; j=j+3)
            {
                array[i] = test[j];
            }
        }
        for (int i = 0; i <= test.Length; i++)
        {
            for (int j = 1; j < test.Length; j = j + 3)
            {
                array1[i] = test[j];
            }
        }
        for (int i = 0; i <= test.Length; i++)
        {
            for (int j = 2; j < test.Length; j = j + 3)
            {
                array2[i] = test[j];
            }
        }
        foreach (int item in array)
        {
            Console.WriteLine(item);
        }

    }
}

根据 c# 中的特定模式将数组拆分为较小的数组

LINQ 方法Where具有索引参数的重载,您可以使用 Skip 、该重载和模运算符来实现这一点:

double[] test = { 0.2, 1.4, 2.45, 3.66, 4.34, 5.8, 6.9, 7.56, 8.899, 9.232, 10.1, 11.1, 12.45, 13.87, 14.8, 15.78 };
var first = test.Skip(0).Where((x, i) => i%3 == 0);
var second = test.Skip(1).Where((x, i) => i%3 == 0);
var third = test.Skip(2).Where((x, i) => i%3 == 0);

在此示例中,i是项目的索引。执行i % 3每三个项目返回一次。上面的代码生成类型 IEnumerable<double> 的集合。如果您需要double[]请拨打每个电话ToArray

作为警告,如果要多次迭代这些结果中的每一个,则需要对每个结果调用ToArrayToList。如果不这样做,test数组将每次都迭代,效率非常低。

你可以像这样利用 linq 的强大功能:

double[] test = { 0.2, 1.4, 2.45, 3.66, 4.34, 5.8, 6.9, 7.56, 8.899, 9.232, 10.1, 11.1, 12.45, 13.87, 14.8, 15.78 };
var numberOfArrays = 3;
var sublists = test.Select((i, idx) => new { Item = i, Index = idx })
            .GroupBy(x => x.Index % numberOfArrays)
            .Select(g => g.Select(x => x.Item).ToArray())
            .ToList();

上面的解决方案允许您指定数组的数量,它会相应地将原始数组拆分为数组列表。这是通过使用模运算符(由%符号表示)来实现的。

尽管 LINQ 为您的问题提供了真正优雅的解决方案,但它们有点矫枉过正。此外,我认为在尝试和使用 c# 的更高级功能之前,您需要先掌握一些基本概念。

第一:

double[] array = double [0];

实际做的是创建一个空的双精度数组,实际上,它会给你一个语法错误,你的代码应该读double[] array = new double [0];。您真正想要的是使用列表:

List<double> array = new List<double>();

这将创建您真正想要的集合。若要将项追加到此集合,请使用以下命令(此外,消除外部循环,它不应该在那里):

for (int j = 0; j < test.Length; j = j + 3)
{
    array.Add(test[j]);
}

你的最终 foreach 循环不应该是读取整数,它应该是读取双精度

foreach (double item in array)
{
    Console.WriteLine(item);
}

应用这些更改,您的代码将按预期:)工作。

最后,你不需要 3 个单独的循环来完成工作,你可以在一个循环中填充 3 个数组(或任何数量的数组),但那个留给你。

这里有一些错误:

这意味着"创建一个零项长的数组"。 考虑到您要填充这些数组,您应该使用大于零的数字。 在您的示例中,Test.length / 3似乎是正确的数字。

double[] array = double [0]; // This is wrong
// Try this instead:
var array = new double[test.Length / 3]; // div 3 because you have 3 output arrays

然后在这里,您希望将外部循环限制为数组。长度,而不是测试。长度:

    for (int i = 0; i < array.Length; i++)
    {
        array[i] = test[i*3];
    }