Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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
C# 如何在一个for循环中将矩阵放入数组?_C# - Fatal编程技术网

C# 如何在一个for循环中将矩阵放入数组?

C# 如何在一个for循环中将矩阵放入数组?,c#,C#,我试图将矩阵的值按特定顺序放入数组中。矩阵为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 <

我试图将矩阵的值按特定顺序放入数组中。矩阵为
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++;
}
Int[,]结果=新的Int[2,长度/2];
字符串[]结果数组=新字符串[长度];
跟踪器=0;
while(跟踪器<长度)
{
对于(int i=0;i
当我运行这段代码时,我得到System.IndexOutOfRangeException:“索引超出了数组的界限。”错误消息。for循环中的第二个表达式是highlite

我似乎没有意识到我做错了什么<当i=(length/2-1)时,code>(2*i)+1
应该等于
length-1
,对吗?

不是一个明确的答案,但比你的方法更能防止错误:通过你可以使用的方阵进行迭代

    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]);    
}
intd=2;
int length=d*d;//方阵;
for(int i=0;i逐行(或水平)遍历数组
int y=输入/输出;
int x=i%d;//=>i模2(除以2的余数)
resultArray[i]=Convert.ToString(结果[x,y]);
}
for(int i=0;i逐列(或垂直)遍历数组
int x=输入/输出;
int y=i%d;
resultArray[i]=Convert.ToString(结果[x,y]);
}

您可以使用MathNet.Numerics库和一些LINQ来实现您想要的:

PM>安装软件包MathNet.Numerics


如果初始数组的形状为[4,2],而不是[2,4],则可以使用
ToColumnArrays()
,实际上可以使用LINQ在矩阵上迭代。您只需使用
Cast()
获得正确的IEnumerable接口,然后使用简单的选择。它将首先迭代第一个维度,然后在该维度内迭代第二个维度

如果我像这样设置测试数据:

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 resultArray2 = result.ToSingleDimension().Select( n => n.ToString("00")).ToArray();
那么这句话,

var resultArray1 = result.Cast<int>().Select( n => n.ToString("00")).ToArray();
如果希望首先迭代第二个维度,可以编写一个简短的扩展方法:

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];
        }
    }
}
这将产生以下结果:

00
01
02  
03
04
10
11
12
13
14
00
10
01
11
02
12
03
13
04
14

请参见上的示例。

为什么在
循环时有外部
?以及抛出错误时
i
是什么(因此,
(2*i)是什么)+1
,与
length
相比?您可以尝试创建一个重现问题的问题,并编辑问题以包含该问题。需要注意的一点是,除非您特别强制执行
length
为偶数,
length==2*(length/2)
可能不是真的。
长度的值是多少?如果是奇数,则执行整数除法时,
长度/2
将不正确(即
5/2=2
)。但是,这只会导致
resultArray
中的最后一项
null
。您能否发布一个重现问题的工作示例(上面的示例对于长度为
5
6
的我来说效果很好)?另外,
while
循环是多余的-你只是一遍又一遍地做同样的赋值。你只需要
for
循环。这是一个异常复杂和过度设计的问题,基于这个问题,OP在这里有一个失败的for循环,我不认为推荐外部库并将该矩阵映射到arra那么,添加sublinq查询是合适的
00
10
01
11
02
12
03
13
04
14