Запись в TDictionary - PullRequest
       55

Запись в TDictionary

0 голосов
/ 30 ноября 2018

Как я могу использовать record в TDictionary?

TMyRec = record
    a: Integer;
    b: Integer;
end;

...

dictionary = TDictionary<String, TMyRec>.create();

...

dictionary[key].a := 30;<<<

Здесь компилятор выдает ошибку: «Левая сторона не может быть назначена».Как я могу решить эту проблему, не создавая отдельную функцию для записи myFunc(a, b: Integer): TMyRec?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Дэвид Хеффернанс ответ - это то, что вы ищете, но я хотел бы предложить дополнительное предупреждение.Записи могут иметь свойства, аналогичные классам, с методами получения и установки, и если ваша запись имеет такие свойства, ваш код будет компилироваться, но он все равно не изменит фактическое значение записи.

TMyRec = record
private
  FA : integer;
  procedure SetA(const Value: integer);
  function GetA : integer;
public
  { Warning: When used on result from dictionary lookup, only the COPY will be 
    altered, not the actual record in the dictionary! }
  property A : integer read GetA write SetA; 
end;
0 голосов
/ 30 ноября 2018

dictionary[key] возвращает копию записи, хранящейся в словаре.Компилятор не позволяет вам изменить это, потому что это бесполезно.

Кроме того, старые версии программы принимают ваш код, и было очень странно, что модификация записи будет потеряна.Вы бы сделали назначение, но ничего видимого не изменилось, потому что то, что вы назначили, было безымянной локальной переменной.

Очевидно, вы намереваетесь изменить запись, хранящуюся в коллекции.Для этого вам нужно назначить всю запись.Считайте запись из коллекции в локальную переменную.Изменить локальную переменную.Запишите обновленное значение обратно в коллекцию.Вот так:

var
  rec: TMyRec;
...
rec := dictionary[key];
rec.a := 30;
dictionary[key] := rec;

Одним из неприятных аспектов этого является то, что код должен выполнить два поиска по словарю, даже если мы знаем, что второй найдет ту же запись, что и первый.Даже мощный словарь Spring4d не может сделать это с помощью одного поиска.

...