Проблема с динамическим созданием зубчатого массива в C #

Вышеупомянутый вопрос и ответ довольно старые. Во всяком случае, если кто-то посещает это, я чувствую, что должен добавить:

Этот ответ совершенно неверен. Фактически в Mongo Documents ARE заказываются пары ключ-значение. Однако при использовании pymongo он будет использовать python dicts для документов, которые действительно не упорядочены (так как cpython 3.6 python dicts сохраняет порядок, однако это считается деталью реализации). Но это ограничение драйвера pymongo.

Имейте в виду, что это ограничение фактически влияет на удобство использования. Если вы запрашиваете db для поддокумента, он будет соответствовать только, если порядок пар ключей-значений правильный.

Просто попробуйте следующий код самостоятельно:

from pymongo import MongoClient
db = MongoClient().testdb
col = db.testcol
subdoc = {
   'field1': 1,
   'field2': 2,
   'filed3': 3
}
document = {
   'subdoc': subdoc
}
col.insert_one(document)
print(col.find({'subdoc': subdoc}).count())

Каждый раз этот код запускается, тот же самый документ добавляется в коллекцию. Таким образом, каждый раз, когда мы запускаем этот фрагмент кода, печатное значение «должно» увеличиваться на единицу. Это происходит не потому, что find только перехватывает subdocuemnts с правильным порядком, но python dicts просто вставляет subdoc в произвольный порядок.

см. Следующий ответ, как использовать упорядоченный dict для преодоления этого: https: // stackoverflow.com/a/30787769/4273834

1
задан TheGeneral 4 March 2019 в 01:28
поделиться

1 ответ

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

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

Вы можете использовать Array.Copy для копирования значений в данный момент времени из originalArray

[ 110]

Заметьте , это полностью не проверено, и я понятия не имею, работает ли остальная часть вашего кода как задумано


Дополнительно Ресурсы

Метод Array.Copy

Копирует диапазон элементов из одного массива в другой массив и выполняет приведение типов и упаковку по мере необходимости. [ 1115]

Массивы (Руководство по программированию в C #)

Типы массивов - это ссылочные типы, полученные из абстрактного базового типа Array . Поскольку этот тип реализует IEnumerable и IEnumerable, вы можете использовать итерацию foreach для всех массивов в C #.

0
ответ дан TheGeneral 4 March 2019 в 01:28
поделиться
Другие вопросы по тегам:

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