我正在尝试按特定顺序将矩阵的值放入数组中。矩阵为2*length
,其中长度是用户选择的消息长度除以2。数组是整个长度。
我尝试使用for循环,其中将矩阵的前两个值([0,0]和[1,0])放入数组中。
Int[,] result = new int[2, length/2];
String[] resultArray = new string[length];
tracker = 0;
while (tracker < length)
{
for (int i = 0; i < length/2; i++)
{
resultArray[2*i] = Convert.ToString(result[0, i]);
resultArray[(2*i)+1] = Convert.ToString(result[1, i]);
}
tracker++;
}
当我运行此代码时,我得到System.IndexOutOfRangeException:'索引在数组的边界之外。'错误信息。 for循环中的第二个表达式高亮显示。
我似乎无法意识到我做错了什么。 (2*i)+1 when i=(length/2-1)
应该等于length-1
,对吧?
答案 0 :(得分:0)
不是一个明确的答案,但是比您的方法更能证明故障:要遍历可以使用的方阵
var y = i / d
var x = i % d
其中d
是数组的维度
int d = 2;
int length = d * d; // square matrix;
for (int i = 0; i < length; i++)
{
// iterate trough the array via column -> row by row (or horizontal)
int y = i / d;
int x = i % d; // => i mod 2 (remnant of division by 2)
resultArray[i] = Convert.ToString(result[x, y]);
}
for (int i = 0; i < length; i++)
{
// iterate trough the array via row -> column by column (or vertical)
int x = i / d;
int y = i % d;
resultArray[i] = Convert.ToString(result[x, y]);
}
答案 1 :(得分:0)
您实际上可以使用LINQ在矩阵上进行迭代。您只需要使用Cast<T>()
来获取正确的IEnumerable接口,然后使用简单的Select。它将首先在第一个维度上进行迭代,然后在第二个维度内进行迭代。
如果我这样设置测试数据:
int[,] result = new int[2, 5];
result[0,0] = 00;
result[0,1] = 01;
result[0,2] = 02;
result[0,3] = 03;
result[0,4] = 04;
result[1,0] = 10;
result[1,1] = 11;
result[1,2] = 12;
result[1,3] = 13;
result[1,4] = 14;
然后这句话:
var resultArray1 = result.Cast<int>().Select( n => n.ToString("00")).ToArray();
将产生以下结果:
00
01
02
03
04
10
11
12
13
14
如果您想先遍历第二维,可以编写一个简短的扩展方法:
public static IEnumerable<T> ToSingleDimension<T>(this T[,] source)
{
for (int i=0; i<=source.GetUpperBound(1); i++)
{
for (int j=0; j<=source.GetUpperBound(0); j++)
{
yield return source[j,i];
}
}
}
并这样称呼它:
var resultArray2 = result.ToSingleDimension().Select( n => n.ToString("00")).ToArray();
将产生以下结果:
00
10
01
11
02
12
03
13
04
14
请参见DotNetFiddle上的示例。
答案 2 :(得分:-1)
您可以将 MathNet.Numerics 库与一些LINQ结合使用来实现所需的目标:
PM>安装包MathNet.Numerics
var result = new double[2,4]
{
{ 1,2,3,4 },
{ 5,6,7,8 },
};
var resultArray = Matrix
.Build
.DenseOfArray(result)
.ToRowArrays()
.SelectMany(q => q.ToArray().Select(w => w.ToString()))
.ToArray();
如果初始数组的形状为[4,2]而不是[2,4],则可以使用ToColumnArrays()