Ответ Дэвида великолепен, но я думаю, что по мере прохождения данных вы будете заполнять список довольно быстро, и вероятность того, что значение будет больше, чем то, что уже есть в списке, вероятно, со временем уменьшится.
Итак, для производительности, я думаю, вы могли бы добавить эту строку перед циклом for, чтобы быстро отбрасывать значения, которые не попадают в топ-10:
if (Item.Value <= Top10[Top10.Count - 1].Value) and (Top10.Count = 10) then
Exit;
Если значения с плавающей точкой всегда будут выше определенного порогового значения, возможно, имеет смысл инициализировать массив с 10 записями, занимающими место, со значениями ниже порогового значения, чтобы вы могли изменить первую строку следующим образом:
if (Item.Value <= Top10[9].Value) then
Exit;
И улучшить метод до этого:
procedure Add(const Item: TMyRecord);
var
i: Integer;
begin
// Throw it out if it's not bigger than our smallest top10
if (Item.Value <= Top10[9].Value) then
Exit;
// Start at the bottom, since it's more likely
for i := 9 downto 1 do
if Item.Value <= Top10[i - 1].Value then
begin
// We found our spot
Top10.Insert(i, Item);
// We're always setting it to 10 now
Top10.Count := 10;
// We're done
Exit;
end;
// Welcome, leader!
Top10.Insert(0, Item);
// We're always setting it to 10 now
Top10.Count := 10;
end;