C#for二维List循环

时间:2016-08-22 07:23:40

标签: c# list loops

List<List<double>> A = new List<List<double>>()
{
    new List<double>() { 1, 0, 0 },
    new List<double>() { 1, -1, 0 }
};

List<List<double>> Temm = new List<List<double>>();
for (int i = 0; i < A.Count; i++)
{
     for (int j = 0; j < A[i].Count; j++)
     {
         if (A[i][j] != 0) 
         {
             Temm[i][j] = A[i][j]; 
         }
         else 
         { 
             Temm[i][j] = Temm[i][j - 1]; }
         }
     }
}

这个double for循环有问题,我认为Temm[i][j]可能是非法的,那么正确的方法是什么?我还想知道如何声明二维List

的给定大小
List<List<double>> Temm = new List<List<double>>

Z * Y

5 个答案:

答案 0 :(得分:3)

你有两个问题。

  1. 当你第一次开始循环内部循环时,你应该在输出集合中的那个地方初始化循环。
  2. 当您尝试访问[i] [j]时 - 还有一个尚未存在的 - 这是每次失败。而是使用Insert方法:

    List<List<double>> A = new List<List<double>>()
    {
        new List<double>() { 1, 0, 0 },
        new List<double>() { 1, -1, 0 }
    };    
    
    List<List<double>> Temm = new List<List<double>>(A.Count);
    for (int i = 0; i < A.Count; i++)
    {
        Temm.Insert(i,new List<double>());
        for (int j = 0; j < A[i].Count; j++)
        {
            if (A[i][j] != 0) { Temm[i].Insert(j,A[i][j]); }
            else { Temm[i].Insert(j,Temm[i][j - 1]); }
        }
    }
    
  3. 因为每次插入列表末尾我都希望使用Add

    List<List<double>> B = new List<List<double>>();
    for (int i = 0; i < A.Count; i++)
    {
        List<double> innerResult = new List<double>();
        for (int j = 0; j < A[i].Count; j++)
        {
            if (A[i][j] != 0)
            {
                innerResult.Add(A[i][j]);
            }
            else
            {
                innerResult.Add(innerResult[j - 1]);
            }
        }
        B.Add(innerResult);
    }
    

答案 1 :(得分:2)

  

我认为Temm [i] [j]可能是非法的

是的。请改用[i,j]

  

我也想知道如何声明两者的给定大小   维度列表

正确的方法是:

List<List<double>> Temm = new List<List<double>>();
for (int i=0; i<A.Count; i++)
{
    Temm[i] = new List<double>();
  //Your code

答案 2 :(得分:1)

对于数组,请使用[i,j]

对于列表,初始化外部列表的所有元素。

List<List<double>> Temm = new List<List<double>>();
for (var i=0; i<i_max; i++)
    Temm.Add( new List<double>() );

答案 3 :(得分:1)

Temm [i] [j]不违法。在这种情况下使用列表,它是访问内部列表的项目而不使用其间的变量的唯一方法。 Temm[i][j]相当于var temmInner = Temm[i]; ... temmInner[j] ...

如果您有多维数组,则只能使用[i, j],而不是数组数组(或代码中的列表列表)。

您无法声明List的大小。充其量你可以给它一个起始容量(当你向列表中添加更多项目时会增加)

我在您的代码中看到的一个错误是您从未向Temm添加新列表,因此我建议您将代码更改为:

List<List<double>> Temm = new List<List<double>>();
for (int i = 0; i < A.Count; i++)
{
    Temm.Add(new List<double>());
    for (int j = 0; j < A[i].Count; j++)
    {
        double temmValue;
        if (A[i][j] != 0) { temmValue = A[i][j]; }
        else { temmValue = Temm[i][j - 1]; }
        Temm[i].Add(temmValue)
    }
}

btw一些非常可疑的代码是if (A[i][j] != 0) { ... } else { ... Temm[i][j - 1]; }你现在依赖于内部A列表的第一项永远不是0的事实。检查j == 0可能是个好主意。同样。

答案 4 :(得分:0)

        List<List<double>> Temm = new List<List<double>>();
        for (int i = 0; i < A.Count; i++)
        {
            Temm.Add(A[i]);

            for (int j = 0; j < A[i].Count; j++)
            {
                if (A[i][j] != 0)
                {
                    Temm[i][j] = A[i][j];
                }
                else
                {
                    Temm[i][j] = Temm[i][j - 1];
                }
            }
        }