Вопросы по 2D спискам C #

2

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

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

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

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

  • 1
    Если это чтение, которое подвергается частым операциям, вы можете вместо этого рассмотреть Array . Меньше функциональности, но больше скорости. Кроме того, если нет уверенности в том, что все элементы должны быть доступны, рассмотрите IEnumerable . Кроме того, по модели, если это истинная матричная структура, вы не хотите использовать список списков. Это устанавливает одно измерение как превосходящее другое, и будущая работа в «неправильном» измерении будет сукой. Грустный опыт моей работы ... Это становится особенно очевидным для n-измерений, но суть все еще в силе в вашем случае.
  • 1
    Если вы ищете скорость ада, вы можете хранить все в одномерном списке. Затем доступ к элементам осуществляется с помощью магии деления по модулю и целому числу, позиция [x, y] соответствует элементу x + y * x_size 'th. Однако читаемость и простота пострадают.
Теги:
list
multidimensional-array

2 ответа

1

Да, вы действительно можете использовать многомерные массивы или зубчатые массивы для хранения "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

Вы можете создать 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>>();

и перебрать их, используя Enumerator и, например, цикл for:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню