2015-05-06 3 views
0

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

TMyCLass = Class() 
    .... 
end; 


MyObjectList = TObjectList <TMyClass>; 


var MySaveClass : TMyCLass; 
begin 
    MySaveClass = MyObjectList.items[saveindex]; 

    for i = 1... MyObjectList.count-1 do 
     if i <> saveindex then 
     MyObjectList.delete (i); ?? // not working :-) 

end; 
+4

['Extract'] (http://docwiki.embarcadero.com/Libraries/XE8/en/System.Generics.Collections.TList.Extract) элемент. Затем ['Clear'] (http://docwiki.embarcadero.com/Libraries/XE8/en/System.Generics.Collections.TList.Clear) список, [' Добавить'] (http: //docwiki.embarcadero. com/Libraries/XE8/ru/System.Generics.Collections.TList.Add) элемент возвращается к списку. ['DeleteRange'] (http://docwiki.embarcadero.com/Libraries/XE8/en/System.Generics.Collections.TList.DeleteRange) выглядит бесполезным здесь. – TLama

+1

@TLama: Почему вы продолжаете злоупотреблять комментариями, чтобы дать ответы? – Kromster

ответ

4

Как TLama сказал в комментарии, Extract элемент, Clear список (если OwnsObjects является ложным, цикл через и свободно каждый элемент первого), а затем Add элемент обратно.

var 
    SavedItem: TMyClass; 
... 
    SavedItem := MyObjectList.Extract(MyObjectList.Items[i]); 
    // Loop here to free if needed because list doesn't own objects 
    MyObjectList.Clear; 
    MyObjectList.Add(SavedItem); 
+0

Если OwnSObjects FALSE, то вместо того, чтобы повторять и освобождать каждый элемент, вы можете установить его в TRUE, затем CLEAR, а затем вернуть его в FALSE. – Dsm

+0

@Dsm Если OwnsObjects является ложным, то, вероятно, что-то еще им владеет, и вы не должны их уничтожать. –

+0

@ Давид Хефферман - предположительно верно и для оригинального решения? Я просто сделал комментарий, чтобы облегчить решение. И я считаю, что комментарий действителен. – Dsm

1

Если список объектов имеет OwnsObjects: = True, вы можете просто удалить элементы. Но будьте осторожны, чтобы сделать это назад, иначе вы можете получить сообщение об ошибке.

for i := MyObjectlist.count -1 downto 0 do 
    if i = Saveindex then 
    continue 
    else 
    MyObjectList.Delete(i); 
+0

if i = Saveindex Я не хочу удалять этот объект, поэтому delete с i user1769184

+0

, но попробуйте, если MyObjectlist [i] = MyObjectList [SaveIndex] затем продолжит; Но я думаю, что подход, предложенный Кеном Уайтом и Тламой, более разумен, чем повторение, я просто хотел указать, что вы должны повторять назад, а не вперед, чтобы избежать ошибок. Приветствия. – Vollmilchbb

+0

Пробовал ли вы использовать этот код с 10 элементами в списке и SaveItem = 8? –