Вопросы по 2D спискам C # - PullRequest
2 голосов
/ 28 марта 2019

Я столкнулся с проблемой со списками, так как мне нужно создать двумерный список, в котором я могу читать данные, предоставляя столбцы и строки, чтобы я мог читать из своего списка, используя my_List[col][row], поэтому это возможносделать 2D-список таким образом?

Насколько это может повлиять на производительность, и что я должен знать, что может повлиять на производительность кода?Возможно, мне придется читать несколько сотен раз в секунду из моего 2D-списка

Возможно ли иметь 2D-список с большим количеством типов сетки, поэтому, если у меня есть данные в 3, 4 и 5, но у меня нет ничего в 01 и 2 воспринимают это как координаты.так я могу прочитать из списка, используя myList[3][5] и получить оттуда данные с 0, 1 и 2, не имеющие ничего?или мне нужно перебрать его и добавить туда что-то вроде нуля?

заранее спасибо!

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Да, вы действительно можете использовать многомерные массивы или неровные массивы для хранения "2D данных".

Что касается создания структуры данных, которая не использует пространство памяти для неиспользуемых индексоввариант может заключаться в использовании словаря, в котором ключи являются кортежами из двух чисел, например так (при условии, что ваши данные являются строками):

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"

Конечно, вы, вероятно, хотите инкапсулировать эту функциональность в свою собственнуюкласс, но вы поняли.

Обратите внимание, однако, что этот словарный подход, вероятно, будет хуже, чем простой массив с точки зрения производительности, но вы должны экспериментировать и собирать некоторые показатели.

1 голос
/ 28 марта 2019

Вы можете создавать 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 вы можете изменять инкапсулированные списки так, как вам нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...