Многомерные структуры данных в C # - PullRequest
1 голос
/ 05 декабря 2009

Как создать многомерную структуру данных в C #?

На мой взгляд, это работает так:

 List<List<int>> results = new List<List<int>>();
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            results[i][j] = 0;
        }
    }

Это не работает (выдает ArgumentOutOfRangeException). Есть ли в C # многомерная структура, которая позволяет мне получать доступ к членам через их индексы?

Ответы [ 5 ]

10 голосов
/ 05 декабря 2009

Проблема в том, что List не создает элементы автоматически. Для инициализации List<List<T>> вам нужно что-то вроде этого:

List<List<int>> results = new List<List<int>>();

for (int i = 0; i < 10; i++)
{
    results.Add(new List<int>());
    for (int j = 0; j < 10; j++)
    {
        results[i].Add(0);
    }
}

Обратите внимание, что настройки Capacity недостаточно, вам нужно позвонить Add столько раз, сколько вам нужно. Кроме того, вы можете упростить вещи, используя класс Enumerable Линка:

List<List<int>> results = new List<List<int>>();

for (int i = 0; i < 10; i++)
{
    results.Add(new List<int>());
    results[i].AddRange(Enumerable.Repeat(0, 10));
}

Опять же, обратите внимание, что Enumerable.Repeat(new List<int>(), 10) не будет работать, так как добавит 10 ссылок в один и тот же список.

Другой подход, использующий Linq до крайности:

List<List<int>> results = Enumerable.Repeat(0, 10)
    .Select(i => Enumerable.Repeat(0, 10).ToList())
    .ToList();

(Неиспользуемый параметр i необходим для того, чтобы вы не ссылались на один и тот же список десять раз, как описано выше.)

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

for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        results[i][j] = 2;
        int x = results[i][j];
    }
}
3 голосов
/ 05 декабря 2009

Если вы заранее знаете размеры своей структуры и не планируете добавлять или удалять элементы, то двумерный массив звучит как ваша вещь:

int[,] n = new int[10, 20];
for (int i = 0; i < 10; ++i) {
    for (int j = 0; j < 10; ++j) {
        n[i, j] = ...
    };
};
2 голосов
/ 05 декабря 2009

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

    List<List<int>> results = new List<List<int>>();

    for (int i = 0; i < 10; i++)
    {
        results.Add(new List<int>(Enumerable.Repeat(0, 10)));
    }
2 голосов
/ 05 декабря 2009

Вы должны фактически 1) создать каждый из внутренних списков и 2) установить их в этом размере.

var Results = Enumerable.Range(0, 10).Select(i => Enumerable.Repeat(0, 10).ToList()).ToList();

Хотя я немного наркоман Linq.

0 голосов
/ 05 декабря 2009

Вы могли бы использовать datatable и добавить столбцы и строки? После этого вы сможете ссылаться на них по имени или индексу.

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