关于二维列表C#的问题

时间:2019-03-28 09:22:31

标签: c# .net list multidimensional-array

我遇到了一个列表问题,因为我需要创建一个二维列表,在其中可以通过给出列和行来读取数据,因此可以使用my_List[col][row]从列表中读取数据,因此可以这样制作2D列表吗?

这会对性能产生多大的影响?我应该意识到可能会对代码产生性能影响的任何内容?我可能需要每秒从2D列表中读取几百次

是否有可能具有更多的网格类型2D列表,所以如果我在3、4和5中有数据,但是在0、1和2中没有任何数据,则将其视为坐标。所以我可以使用myList[3][5]从列表中读取数据并从那里获得0、1和2都没有的数据吗?还是我需要遍历它并在其中添加诸如null的内容?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

您可以像这样创建2D数组:

string[,] twoDArray = new string[2,2];

然后您可以像这样遍历它:

        for (int i = 0; i < twoDArray.Length; i++)
        {
            foreach (int j in twoDArray[i,0])
            {

            }
        }

您还可以像这样创建2D列表:

List<List<string>> grid = new List<List<string>>();

并使用枚举器(例如for循环)遍历它们:

 var enu = grid.GetEnumerator();
            while (enu.MoveNext())
            {
                for(int i = 0; i < enu.Current.Count; i++)
                {
                    enu.Current.RemoveAt(i);
                }
            }

基本上,您要遍历所有列表,然后遍历每个列表,只要它的大小即可。在for循环中,您可以按照自己喜欢的任何方式更改封装列表。

答案 1 :(得分:1)

是的,您确实可以使用multidimensional arrays or jagged arrays来存储“ 2D数据”。

对于创建不使用任何内存空间用于未使用索引的数据结构,一种选择是使用字典,其中键是两个数字的元组,例如这样(假设您的数据是字符串):< / p>

var items = new Dictionary<(int, int), string>();

items.Add((0,1), "0-1"); //this throws an error if the key already exists
items[(2,3)] = "2-3";    //this silently replaces the value if the key already exists

Console.WriteLine(items.Keys.Contains((0,1))); //true
Console.WriteLine(items.Keys.Contains((0,2))); //false

Console.WriteLine(items[(2,3)]); //"2-3"

当然,您可能希望将此功能封装在自己的类中,但是您明白了。

但是请注意,这种字典方法在性能方面可能会比普通数组差,但您可以尝试并收集一些指标。