Как я могу преобразовать список <> к многомерному массиву?

Посмотрите на официальное изображение dog postgresql

У него такой рабочий процесс:

  1. Выполните docker-entrypoint.sh
  2. Запустите postgresql сервер

Итак, вам нужно изменить ваш Dockerfile следующим образом:

COPY ./docker-entrypoint.sh /

RUN chmod +x /docker-entrypoint.sh

USER postgres

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 5432
CMD ["postgres"]

И затем изменить ваш docker-entrypoint.sh следующим образом:

#!/bin/sh

# Before PostgreSQL can function correctly, the database cluster must be initialized:
initdb -D /var/lib/postgres/data

# internal start of server in order to allow set-up using psql-client
# does not listen on external TCP/IP and waits until start finishes
pg_ctl -D "/var/lib/postgres/data" -o "-c listen_addresses=''" -w start

# create a user or role
psql -d postgres -c "CREATE USER someuser WITH PASSWORD 'jkhkjah';" 

# create database 
psql -v ON_ERROR_STOP=1 -d postgres -c "CREATE DATABASE dockertest OWNER 'someuser';"

# stop internal postgres server
pg_ctl -v ON_ERROR_STOP=1 -D "/var/lib/postgres/data" -m fast -w stop

exec "$@"

Я думаю, что ваша главная ошибка - запуск postgresql в фоновом режиме

/usr/bin/postgres -D /var/lib/postgres/data &

и немедленное выполнение запросов до запуска сервера.

Также я рекомендую добавить -v ON_ERROR_STOP=1 параметры в psql, чтобы увидеть подробную информацию и остановить процесс в случае ошибки

5
задан GEOCHET 24 March 2009 в 16:51
поделиться

3 ответа

Нет. На самом деле это не обязательно совместимые массивы.

[,] определяет многомерный массив. List<List<T>> соответствовал бы больше зубчатому массиву ( object[][] ).

Проблема состоит в том что, с Вашим исходным объектом, каждым List<object> содержавшийся в списке списков может иметь другое количество объектов. Необходимо было бы сделать многомерный массив из самой большой длины внутреннего списка и клавиатуру с нулевыми значениями или чем-то вдоль тех строк, чтобы заставить его соответствовать.

11
ответ дан 18 December 2019 в 09:10
поделиться

Вы не собираетесь получать очень простое решение для этого (т.е. несколько строк). LINQ/the Enumerable класс не собирается помогать Вам в этом случае (хотя он мог, если бы Вы хотели зубчатый массив, т.е. Object[][]). Вложенное повторение плоскости является, вероятно, лучшим решением в этом случае.

public static T[,] To2dArray(this List<List<T>> list)
{
    if (list.Count == 0 || list[0].Count == 0)
        throw new ArgumentException("The list must have non-zero dimensions.");

    var result = new T[list.Count, list[0].Count];
    for(int i = 0; i < list.Count; i++)
    {
        for(int j = 0; j < list[i].Count; j++)
        {
            if (list[i].Count != list[0].Count)
                throw new InvalidOperationException("The list cannot contain elements (lists) of different sizes.");
            result[i, j] = list[i][j];
        }
    }

    return result;
}

Я включал немного обработки ошибок в функцию просто, потому что она могла бы вызвать некоторые запутывающие ошибки при использовании ее во вложенном списке неквадрата.

Этот метод, конечно, предполагает что каждый List<T> содержавший как элемент родителя List имеет ту же длину. (Иначе действительно необходимо использовать зубчатый массив.)

7
ответ дан 18 December 2019 в 09:10
поделиться

Грубо говоря, ответ не, не легко.

Возможно, требуется отредактировать вопрос дать нам больше фона о том, почему эти объявления необходимы, и мы можем помочь Вам с Вашей корневой проблемой?


Ре Ваше обновление:

Я предполагаю, что Вы не можете изменить функцию, в которую необходимо передать это.

Я не вижу, почему Вы не можете просто использовать object[,] для начала. Это - моя рекомендация.

Я сомневаюсь, что это поможет Вам в Вашей ситуации, но она могла бы сделать часть массива, работающего легче над Вами запуститься с. Вы знаете о .ToArray() метод на a List?

-2
ответ дан 18 December 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: