foreach如何在2d数组作为元素的列表上工作?



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

List<string[,]> listOfLists = new List<string[,]>()
//the array has a variable amount of rows and 3 columns

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

中的数组的第三列
foreach(string smth in listOfLists[0])
{
return smth;
}

我把foreach-loopoverride .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

编辑:我已经尝试了它只是在一个c#脚本像这样

´´´

公共类Fun{

私人List<字符串[,]比;listOfLists>();

public void declareList()
{
listOfLists.Add(new string[2, 3]);
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";
}
public override string ToString()
{
string _smth = "";
foreach(string smth in listOfLists[0])
{
_smth += smth;
}
return _smth;
}
}

´´´

,它工作;它返回ABCDEF。我甚至从上面发现了错误;Return打破了整个foreeach循环,所以它不能结束。这就是为什么它只返回a。

我认为一个评论提到,这是奇怪的,我可以暗示字符串作为字符串[],而声明foreach-loop,但我认为这只是因为当foreach-loop被执行,它是一个字符串,而不是字符串[]。我希望每个人都能理解。

问题是你写的foreach试图遍历字符串,而你在列表中的实际内容是字符串数组

下面是一个在。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));
}
}
}

}
}

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

public override string ToString()
{
string test = "";
foreach(string smth in listOfLists[0])
{
test += smth;
}
return test;
}

它神奇地工作,我发现很有趣的是,因为我有一些尝试中,test += smth不工作的原因,它会显示我一个奇怪的错误信息在Unity。但我不会质疑为什么它会像我希望的那样神奇地工作。

还是谢谢你回答这个问题。

相关内容

  • 没有找到相关文章

最新更新