簡體   English   中英

關於 2D 列表 C# 的問題

[英]Questions about 2D lists C#

我遇到了列表問題,因為我需要創建一個二維列表,我可以在其中通過提供列和行來讀取數據,因此我可以使用my_List[col][row]從我的列表中讀取數據,所以是這樣可以這樣制作二維列表嗎?

這會對性能產生多大影響,以及我應該注意的可能對代碼產生性能影響的任何事情? 我可能需要每秒從我的 2D 列表中讀取數百次

是否可以有更多網格類型的 2D 列表,所以如果我在 3、4 和 5 中有數據,但在 0、1 和 2 中沒有任何數據,請將其視為坐標。 那么我可以使用myList[3][5]從列表中讀取數據並從那里獲取 0、1 和 2 什么都沒有的數據嗎? 還是我需要循環它並在那里添加一些東西,比如空?

提前致謝!

是的,您確實可以使用多維數組或鋸齒狀數組來存儲“二維數據”。

至於為未使用的索引創建不使用任何內存空間的數據結構,一個選項可能是使用字典,其中鍵是兩個數字的元組,如下所示(假設您的數據是字符串):

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"

當然,您可能希望將此功能封裝在它自己的類中,但您明白了。

但是請注意,就性能而言,這種字典方法可能比普通數組更差,但您可以自行試驗並收集一些指標。

您可以像這樣創建二維數組:

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>>();

並使用 Enumerator 迭代它們,例如 for 循環:

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

您基本上是遍歷所有列表,然后遍歷每個列表,只要其大小不變。 在 for 循環中,您可以按照您喜歡的任何方式更改封裝列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM