Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
В TDictionary значения добавляются не по порядку.

Да, можно что-то другое использовать или свой лисапет, но удобство TDictionary в том, что там без конвертации есть целочисленный тип (ключ) TDictionary<integer, string>, т.е. не надо использовать IntToStr.
Может есть что-то похожее искаропки? За эти несколько лет в Delphi вроде надобавляли разных вкусностей.
Может можно TDictionary заставить работать так, как я хочу?

Задача простая. В цикле добавляю значения, а после цикла нужно добавить ещё 2-3, но так, чтобы эти 2-3 были в конце.
14 май 19, 08:49    [21884020]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
я тут пример увидел
https://stackoverflow.com/questions/14490275/tdictionary-populated-during-create-example-code
что TList можно использовать похожим способом

List := TList<TPair<string, Integer>>.Create;
List.Add(TPair<string, Integer>.Create('Foo', 42));
List.Add(TPair<string, Integer>.Create('Bar', 666));


Внимание, вопрос Знатокам :) в этом случае та же проблема будет?
14 май 19, 08:55    [21884025]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25768
X11
Может можно TDictionary заставить работать так, как я хочу?

Тогда его плюсы (скоростные) будут нивелированы.

X11
в этом случае та же проблема будет?

Не должна.
14 май 19, 08:58    [21884030]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
получается небольшое монстро, а не код
Картинка с другого сайта.


List.Add(TPair<Integer, String>.Create(SP_GET_TYPES_LIST.FieldByName('TYPE_ID').AsInteger, SP_GET_TYPES_LIST.FieldByName('TYPE_NAME').AsString));


Переделал немножк

Type

  TPairIntString = TPair<Integer, string>;
...
...
...

function  GetXXX(xxxx): TList<TPairIntString>;
begin
...
  result := TList<TPairIntString>.Create;
...
...      
      while not SP_GET_TYPES_LIST.Eof do
      begin
        Result.Add(TPairIntString.Create(SP_GET_TYPES_LIST.FieldByName('TYPE_ID').AsInteger, SP_GET_TYPES_LIST.FieldByName('TYPE_NAME').AsString));
        SP_GET_TYPES_LIST.Next;
      end;
14 май 19, 11:55    [21884226]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
В общем, да, теперь все элементы по порядку. И после цикла добавляются несколько элементов именно в конец списка.
14 май 19, 11:57    [21884230]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5242
X11
получается небольшое монстро, а не код
Картинка с другого сайта.


      while not SP_GET_TYPES_LIST.Eof do
      begin
        Result.Add(TPairIntString.Create(SP_GET_TYPES_LIST.FieldByName('TYPE_ID').AsInteger, SP_GET_TYPES_LIST.FieldByName('TYPE_NAME').AsString));
        SP_GET_TYPES_LIST.Next;
      end;


маленький хинт: не вычисляй поля на каждой итерации

      
      var F1, F2: TField;
      //……..
      F1 := SP_GET_TYPES_LIST.FieldByName('TYPE_ID');
      F2 := SP_GET_TYPES_LIST.FieldByName('TYPE_NAME');
      while not SP_GET_TYPES_LIST.Eof do
      begin
        Result.Add(TPairIntString.Create(F1.AsInteger, F2.AsString));
        SP_GET_TYPES_LIST.Next;
      end;
14 май 19, 12:17    [21884266]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
да, точно, спасибо
14 май 19, 12:25    [21884275]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
wadman
Тогда его плюсы (скоростные) будут нивелированы.


Не нашел тестов про TDictionary vs Tlist, а тут есть тест про TObjectList vs TObjectDictionary

https://delphi-bar.blogspot.com/2017/09/tobjectlist-vs-tobjectdictionary.html
14 май 19, 12:29    [21884281]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 1642
X11
В TDictionary значения добавляются не по порядку.

по определению не должон

как вариант хранить данные в массиве, а в мапке индекс элемента в массиве
14 май 19, 13:27    [21884354]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11159
X11,

TDictionary нужен для быстрого поиска значений по ключу. Порядок записей в нем не определен. Если тебе нужно просто хранить пары значений, то используй TList<record>. Если же тебе нужен таки TDictionary для доступа ключ-значение, но в какой-то момент вывести записи в каком-то порядке, то делай так
var
  LVals: TArray<TPair<..., ...>>;
  LData: TPair<..., ...>;
begin
  LVals := ADictionary.ToArray;
  TArray.Sort<TPair<..., ...>>(LVals, FComparer);
  for LData in LVals do
    AddData(LData.Key, LData.Value);
end;
14 май 19, 14:21    [21884448]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
_Vasilisk_
TDictionary нужен для быстрого поиска значений по ключу.


я знаю, но мне поиск не нужен в данном конкретном случае, а только хранение и цикл for in
14 май 19, 14:37    [21884477]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
_Vasilisk_
Если же тебе нужен таки TDictionary для доступа ключ-значение, но в какой-то момент вывести записи в каком-то порядке, то делай так


Сортировка по ключу или по значению не подходит. Нужно, чтобы те записи, которые добавлены в список последними, так и оставались последними.

Я уже решил проблему, как я написал выше.
14 май 19, 14:38    [21884479]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11159
X11
я знаю, но мне поиск не нужен
Тогда и TDictionary тебе не нужен
14 май 19, 14:59    [21884507]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2160
_Vasilisk_
Тогда и TDictionary тебе не нужен
+1

X11, не порти сову с глобусом!
14 май 19, 23:52    [21884848]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
ёёёёё
Member

Откуда:
Сообщений: 726
X11,

не слушай их, натягивай и дальше!
15 май 19, 01:05    [21884869]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
На всякий случай повторюсь: я проблему решил.

X11
В общем, да, теперь все элементы по порядку. И после цикла добавляются несколько элементов именно в конец списка.
15 май 19, 08:35    [21884936]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
ёёёёё
Member

Откуда:
Сообщений: 726
X11,

а удаляются - нормально?
15 май 19, 08:36    [21884937]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5107
X11,

поищи TLinkedDictionary, в сети реализаций полно
у меня тоже где-то была на основе TDictionary, но найти не могу
15 май 19, 08:54    [21884943]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
ёёёёё, ещё не удалял, а оно мне и не надо. Если надо, делаю clear и заново наполнение.
15 май 19, 09:09    [21884955]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13227
kealon(Ruslan)
TLinkedDictionary


это что-то искаропки?
15 май 19, 09:09    [21884956]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5107
X11
kealon(Ruslan)
TLinkedDictionary


это что-то искаропки?
он просто относится к классическим структурам (например, в Java это LinkedHashMap), но в RTL его почему-то не реализовали
но энтузиастов много
15 май 19, 10:09    [21885008]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значения добавляются не по порядку  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1755
главное - вовремя остановиться
15 май 19, 10:58    [21885061]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить