Как инициализировать TList‹T› за один шаг с помощью Delphi?

Я уверен, что это простой вопрос, но я не могу заставить его работать:

var
  FMyList: TList<String>;
begin
  FMyList := TList<String>.Create(?????);
end;

Как вставить вместо ????? чтобы вставить эти 3 строки:

'один'
'два'
'три'

Спасибо..


person ferpega    schedule 24.04.2011    source источник
comment
Создайте список, а затем вставьте его с помощью FMyList.Add.   -  person Kaitnieks    schedule 24.04.2011
comment
Да, я делаю сейчас таким образом, но я хотел бы сделать это в один прием.   -  person ferpega    schedule 24.04.2011


Ответы (2)


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

constructor TMyList<T>.Create(const Values: array of T);
var
  Value: T;
begin
  inherited Create;
  for Value in Values do
    Add(Value);
end;

Тогда вы могли бы написать:

FList := TMyList<string>.Create(['one', 'two', 'three']);

Обновить

Как правильно указывает Уве в своем ответе, код, который я представляю, должен использовать метод AddRange():

constructor TMyList<T>.Create(const Values: array of T);
begin
  inherited Create;
  AddRange(Values);
end;
person David Heffernan    schedule 24.04.2011
comment
Я просил уже существующий способ сделать это... Но это хорошее приближение в отсутствие этой функциональности... - person ferpega; 24.04.2011
comment
@FerPt Я знаю, это то, о чем вы просили, поэтому мое первое предложение. - person David Heffernan; 24.04.2011
comment
Я попытался получить ваше приближение с помощью Class Helpers... Не повезло... Кажется, нет способа использовать помощники классов для дженериков... :-( Кажется, ваш ответ является единственным действительным в Delphi XE. - person ferpega; 24.04.2011

Не однострочный, а двухстрочный:

FMyList := TList<String>.Create;
FMyList.AddRange(['one', 'two', 'three']);

Редактировать: Конечно, вы можете комбинировать это с подходом Дэвида.

person Uwe Raabe    schedule 24.04.2011
comment
+1 Я не знаком с AddRange, спасибо за указание. - person David Heffernan; 24.04.2011
comment
Спасибо, Уве, я думаю, что не могу передать «принятый ответ» Дэвиду и вам. Оба ответа хорошие. Спасибо еще раз. - person ferpega; 25.04.2011
comment
Я думаю, что две строки здесь лучше, чем одна, и я сожалею о побочных эффектах конструктора. - person Warren P; 26.04.2011
comment
И одна строка объявления переменной. А если это единственная переменная: одна строка ключевого слова var. Что-то между 3-4 строками. - person Spongebob Comrade; 21.02.2017