根据 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);
}
}
}
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
。
作为警告,如果要多次迭代这些结果中的每一个,则需要对每个结果调用ToArray
或ToList
。如果不这样做,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];
}