C# 用于二维列表的循环

C# for loop of two dimensional List

提问人:user6703592 提问时间:8/22/2016 最后编辑:Gilad Greenuser6703592 更新时间:8/22/2016 访问量:7683

问:

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<double>> Temm = new List<List<double>>

说?Z * Y

C# 列表 循环

评论


答:

1赞 Haukinger 8/22/2016 #1

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

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

List<List<double>> Temm = new List<List<double>>();
for (var i=0; i<i_max; i++)
    Temm.Add( new List<double>() );
1赞 Patrick Huizinga 8/22/2016 #2

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)
    }
}

顺便说一句,一些非常可疑的代码是:您现在依赖于内部列表的第一项永远不会为 0 的事实。检查一下可能也是个好主意。if (A[i][j] != 0) { ... } else { ... Temm[i][j - 1]; }Aj == 0

评论

0赞 user6703592 8/22/2016
当然,我只是使我的代码变得简单。因此,最通用的 for 方法是使用 ?Listloopadd
0赞 Patrick Huizinga 8/22/2016
是的,使用将是添加项目的最通用方法。在这种情况下,您也可以将我的新行更改为并将全部替换为您仍然需要使用索引器来获取项目。所以充其量你可以用AddList<double> temmInner = new List<double>(); Temm.Add(temmInner);Temm[i][j] = ...temmInner.Add(...)Temm[i][j - 1]temmInner[j - 1]
0赞 Patrick Huizinga 8/22/2016
@GiladGreen 你是对的。我不知何故想到您可以使用索引器在索引 == 计数处添加项目。感谢您指出这一点。
2赞 Aditya Korti 8/22/2016 #3

我认为 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

评论

0赞 Patrick Huizinga 8/22/2016
Temm[i][j]不违法。您可能正在考虑多维数组,在这种情况下,这将是访问项目的正确方法。Temm[i, j]
0赞 Gilad Green 8/22/2016
@Aditya - 很好 - 也很好 - 它们是不同的东西。关于建议 - 您是否检查过它是否有效?[i][j][i,j]
4赞 Gilad Green 8/22/2016 #4

您有 2 个问题。

  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]); }
        }
    }
    

因为每次插入到列表末尾时,我都希望使用: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);
}

评论

0赞 user6703592 8/22/2016
所以,不能用?insertadd
0赞 Gilad Green 8/22/2016
@user6703592 - 它们有 2 种不同的功能。 插入到列表的末尾。 它是一个特定的索引。我个人更喜欢,但因为你使用 ,我用它来使它尽可能接近你的语法AddInsertAddij
0赞 Gilad Green 8/22/2016
@user6703592 - 感谢您选择我的答案。
1赞 Gilad Green 8/22/2016
@user6703592 - 下次 - 如果答案没有经过测试,请不要立即为它们投赞成票。例如,帕特里克(Patrick)然后修复了他的,这很好。但其他的都是不正确的答案......
0赞 Valeh Mikayilzadeh 8/22/2016 #5
        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];
                }
            }
        }