【问题标题】:Why cant I refer to a random index in my 4D list, while I know it exists?为什么我不能在我的 4D 列表中引用随机索引,而我知道它存在?
【发布时间】:2015-09-07 23:17:40
【问题描述】:

我有一个 4D 列表,我想要只显示 [k][3][j][z] 的位置,但这不起作用。我检查了所有的计数,它们都是 5+,所以 3[4] 应该可以工作......

for (int k = 0; k < lijst4D.Count; k++)
{
    for (int i = 0; i < lijst4D[k].Count; i++) // This count is higher than 4!
    {
        for (int j = 0; j < lijst4D[k][i].Count; j++)
        {
            for (int z = 0; z < lijst4D[k][i][j].Count; z++)
            {
                Console.WriteLine(lijst4D[k][i][j][z]); // This is working
                Console.WriteLine(lijst4D[k][3][j][z]); // This is NOT working
            }
        }
    }
}

这也不行:

Console.WriteLine(lijst4D[0][0][0][0]);
Console.WriteLine(lijst4D[1][1][1][1]);

为什么这不起作用?谁能解释我?我错过了什么吗?

我收到此错误:Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

编辑:这仍然有效.. 为什么?

for (int k = 0; k < lijst4D.Count; k++)
{
    for (int i = 3; i < 4; i++) // Will do this loop once
    {
        for (int j = 0; j < lijst4D[k][i].Count; j++)
        {
            for (int z = 0; z < lijst4D[k][i][j].Count; z++)
            {
                Console.WriteLine(lijst4D[k][i][j][z]); 
            }
        }
    }
}

EDIT2:我如何填写我的清单:

for (int g = 0; g < List.Count; g++)
{
    List<List<List<string>>> Lijst3D = new List<List<List<string>>>();
    for (int j = 0; j < Alist.Count; j++)
    {
        List<List<string>> Lijst2D = new List<List<string>>();
        for (int k = 0; k < Anotherlist.Count; k++)
        {
            List<string> Lijst1D = new List<string>();
            Lijst2D.Add(Lijst1D);
        }
        Lijst3D.Add(Lijst2D);
    }
    Lijst4D.Add(Lijst3D);
}

提前致谢

【问题讨论】:

  • 看起来与您几天前发布的问题非常相似。坦率地说,“工作与否”完全取决于你如何填充你的数组。没有看到就很难说更多。
  • 一秒钟,我将添加代码,向您展示我如何填写我的 4Dlist
  • 我添加了将列表添加到列表等的代码
  • @AndyKorneyev 我确实将我的数组填充添加到了 questoin

标签: c# list for-loop dimensions


【解决方案1】:

根据您填写 4D 列表的代码:

List<string> Lijst1D = new List<string>();
Lijst2D.Add(Lijst1D);

在这里,您正在创建新的 List&lt;string&gt; 并将其添加到父 2D 列表中。

但是Lijst1D 本身不包含任何元素(您还没有向其中添加任何内容),因此Lijst4D[0] 将抛出IndexOutOfRangeException 以及Lijst4D[0][0][0][0] 抛出它。

【讨论】:

  • 没错,我以这种方式将它添加到我的代码中: Lijst4D[x][y][z].Add("test");
  • 但是这行得通是不是很奇怪:for (int i = 3; i &lt; 4; i++) 但这确实有效:Console.WriteLine(lijst4D[k][3][j][z]);?或者这完全可以理解? :)
  • @wouter 这里没什么奇怪的。 Lijst4D[k][i][j].Count 为零(因为您没有向List1D 添加任何内容),因此您在“这是正常工作”示例for (int z = 0; z &lt; lijst4D[k][i][j].Count; z++) 中提供的大多数内部循环根本不执行 - 这就是您的原因没有得到异常。
  • 安迪,感谢您回答我的问题。美好的一天
【解决方案2】:

您使用的是 4 维 (A[a,b,c,d]) 数组还是 4D 锯齿状数组(每个元素都指向另一个数组的数组等)? 似乎您想使用 4D 数组(像 A[i,j] 一样访问它),但您的代码正在访问一个锯齿状数组(例如 A[i][j])

编辑: 我会将列表分解为一个适当的数据结构,我可以正确地对其进行可视化......可能是这样的...... 您可以在每个类中添加一个方法来依次填充其列表容器...

void Main()
{
    var lstOuter= new List<A>();
}

// Define other methods and classes here
class A
{
    public A ()
    {
        ListB=new List<string>();
    }
    public string val{get; set;}
    public List<string> ListB { get; set; }
}

class B
{
    public B ()
    {
        ListC=new List<string>();
    }
    public string val{get; set;}
    public List<string> ListC { get; set; }
}


class C
{
    public C ()
    {
        ListD=new List<string>();
    }
    public string val{get; set;}
    public List<string> ListD { get; set; }

}

【讨论】:

  • 我正在处理一个列表,实际上我不知道,让我添加代码来添加我如何填写我的列表
  • 我添加了将列表添加到列表等的代码。如果我确定 A[i,j] 它会告诉我代码必须采用 4 个参数
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
相关资源
最近更新 更多