C#: При добавлении того же объекта к двум Спискам <объект> переменные объект клонирован в процессе?

Чтобы объединить ответы Дэвида Гриффена и В. Саммы, вы можете просто сделать это, чтобы сгладить, избегая дублирования имен столбцов:

import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.Column
import org.apache.spark.sql.DataFrame

def flattenSchema(schema: StructType, prefix: String = null) : Array[Column] = {
  schema.fields.flatMap(f => {
    val colName = if (prefix == null) f.name else (prefix + "." + f.name)
    f.dataType match {
      case st: StructType => flattenSchema(st, colName)
      case _ => Array(col(colName).as(colName.replace(".","_")))
    }
  })
}

def flattenDataFrame(df:DataFrame): DataFrame = {
    df.select(flattenSchema(df.schema):_*)
}

var my_flattened_json_table = flattenDataFrame(my_json_table)
15
задан Austin Hanson 5 June 2009 в 18:13
поделиться

7 ответов

Да, но ничего не клонируется. Перед назначением один и тот же объект находится в обоих списках. После назначения у вас есть два уникальных объекта в двух списках.

Сделайте следующее:

list1[indexOfSomething].name = "SomeOtherName";

и объект в list2 также изменится.

22
ответ дан 1 December 2019 в 00:54
поделиться

Вы не клонируете объект; вы добавляете ссылку на один и тот же объект в два списка. Однако ваш код заменяет ссылку в одном из списков ссылкой на другой объект, так что да, это ожидаемое поведение.

4
ответ дан 1 December 2019 в 00:54
поделиться
// Declarations:
List<SomeType> list1 = new List<SomeType>();
List<SomeType> list2 = new List<SomeType>();

...

SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);

Помните, когда вы добавляете объект в список, вы на самом деле просто добавляете указатель на объект. В этом случае list1 и list2 оба указывают на один и тот же адрес в памяти.

list1[indexOfSomething] = new SomeType("SomeOtherName");

Теперь вы назначили элемент list1 другому указателю.

На самом деле вы не клонируете сами объекты, вы копируете указатели которые просто указывают на тот же объект. Если вам нужно доказательство, сделайте следующее:

SomeType something = new SomeType("SomeName");
list1.Add(something);
list2.Add(something);

list1[someIndex].SomeProperty = "Kitty";

bool areEqual = list1[someIndex].SomeProperty == list2[someIndex].SomeProperty;

areEqual должно быть истинным. Указатели - рок!

7
ответ дан 1 December 2019 в 00:54
поделиться

Да, вы не клонируете объект. Первоначально объект добавляется в оба списка по ссылке, а затем вам назначается ссылка в списке на новый объект, который вы создаете.

Это определенно ожидаемый результат.

3
ответ дан 1 December 2019 в 00:54
поделиться

Когда вы передаете объект «что-то» в Add, вы передаете его по значению (по умолчанию в C #), а не по ссылке

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

4
ответ дан 1 December 2019 в 00:54
поделиться

Да, это ожидаемо. Добавляется только ссылка на объект. Не сама ссылка и не копия.

0
ответ дан 1 December 2019 в 00:54
поделиться

Это потому, что json не имеет разницы между строковыми объектами и объектами Unicode. Это все строки в javascript.

Я думаю, JSON подходит для возврата объектов Unicode . На самом деле, я бы не принял ничего меньшего, поскольку строки javascript на самом деле являются объектами unicode (т.е. строки JSON (javascript) могут хранить любой unicode) символ), поэтому имеет смысл создавать объекты unicode при переводе строк из JSON. Простые строки просто не подходят, так как библиотеке придется угадывать нужную кодировку.

Лучше использовать строковые объекты unicode везде. Поэтому лучше всего обновить библиотеки, чтобы они могли работать с объектами Unicode.

Но если вам действительно нужны строки байтов,

1
ответ дан 1 December 2019 в 00:54
поделиться
Другие вопросы по тегам:

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