unity3d foreach如何处理以二维数组为元素的列表?

0mkxixxg  于 2022-11-15  发布在  其他
关注(0)|答案(2)|浏览(153)

在我的Unity项目中,我有一个列表,其中包含2d字符串数组作为该列表中的元素:

List<string[,]> listOfLists = new List<string[,]>()

//the array has a variable amount of rows and 3 columns

它基本上保存了一些我需要保存的数组。现在,为了控制是否一切正常,我想把它放在一个 foreach-loop 中,并输出保存的所有内容,但它只返回保存在listOfLists[0]中的数组的第3列

foreach(string smth in listOfLists[0])
    {
        return smth;
    }

我把 foreach-loop 放在override .ToString()Debug.Log(xxx.ToString()))中,我知道它应该可以将string[,]作为字符串返回,但它确实返回了第一列,所以如果数组是这样定义的:

listOfLists[0][0, 0] = "A";
listOfLists[0][0, 1] = "B";
listOfLists[0][0, 2] = "C";

listOfLists[0][1, 0] = "D";
listOfLists[0][1, 1] = "E";
listOfLists[0][1, 2] = "F";

它只返回A而不返回B、C、D、E或F。
我可以像这样输出它,所以数组不是不工作或任何东西:

return $"{listOfLists[0][0, 0]} geht in die {listOfLists[0][0, 2]} und ihr Foto ist aufzufinden bei: {listOfLists[0][0, 1]}";

我只是认为把它放在一个 foreach-loop 中比单独调用它更实用。
我知道我在 foreach-loop 上做错了什么,但我不知道是什么,也不知道如何解决。
我的目标是这样返回整个数组:

//return
A B C D E F
vh0rcniy

vh0rcniy1#

您遇到的问题是,您编写的foreach试图迭代字符串,而列表中的实际内容是string arrays
这里有一个在.NET Fiddle上编译和运行的例子,它展示了如何迭代你声明的结构。

using System;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {
        
        List<string[,]> arrayList = new List<string[,]>();
        var twoDArray = new string[5,5];
        // just a couple of items for testing, intentionally leaving some indices null as well
        twoDArray[0,0] = "a";
        twoDArray[0,1] = "b";
        twoDArray[0,2] = "c";
        
        twoDArray[1,0] = "d";
        twoDArray[1,1] = "e";
        twoDArray[1,2] = "f";
        
        arrayList.Add(twoDArray);
        arrayList.Add(twoDArray);
        
        foreach(var array in arrayList)
        {
            Console.WriteLine("=== Starting iterration for another array in the array list ===");
            // iterates over the array as flattened items
            foreach(var arrayItem in array)
            {
                Console.WriteLine(string.Format("Flattened iteration - value {0}", arrayItem));
            }
            
            // or you can iterate over the items with their indices
            for (int x = 0; x < array.GetLength(0); x += 1) 
            {
                for (int y = 0; y < array.GetLength(1); y += 1) 
                {
                    var indexedItem = array[x,y];
                    Console.WriteLine(string.Format("Indexed iteration - at index {0},{1} value {2}", x, y, indexedItem));
                }
            }
        }
        
    }
}
a2mppw5e

a2mppw5e2#

在做了更多的跟踪和错误测试之后,我得出了这个版本:

public override string ToString()
{
    string test = "";

    foreach(string smth in listOfLists[0])
    {
        test += smth;
    }

    return test;
}

它神奇地工作了,我觉得很有趣,因为我有一些尝试,其中 test += smth 由于某种原因不工作,它会在Unity中显示一个奇怪的错误信息。但我不会质疑为什么它神奇地如所愿地工作。
还是谢谢你回答这个问题。

相关问题