TDictionary'den türetilmiş bir koleksiyon tanımladım ve ek bir filtre uygulayan özel bir numaralayıcı tanımlamanız gerekiyor.TDictionary türetilmiş bir sınıf için özel bir numaralayıcı nasıl oluşturulur?
I (bu özel olan) TDictionary FItems dizi erişemez şaşırıp yüzden
nasıl elde edilen bir sınıfı, bir, süzüldü numaralandırıcıyı yeniden tanımlamak için ilerleyecekti MoveNext yöntemini tanımlamak olamaz TDictionary?
TMyItem = class(TObject)
public
IsHidden:Boolean; // The enumerator should not return hidden items
end;
TMyCollection<T:TMyItem> = class(TDictionary<integer,T>)
public
function GetEnumerator:TMyEnumerator<T>; // A value filtered enumerator
type
TMyEnumerator = class(TEnumerator<T>)
private
FDictionary: TMyCollection<integer,T>;
FIndex: Integer;
function GetCurrent: T;
protected
function DoGetCurrent: T; override;
function DoMoveNext: Boolean; override;
public
constructor Create(ADictionary: TMyCollection<integer,T>);
property Current: T read GetCurrent;
function MoveNext: Boolean;
end;
end;
function TMyCollection<T>.TMyEnumerator.MoveNext: Boolean;
begin
// In below code, FIndex is not accessible, so I can't move forward until my filter applies
while FIndex < Length(FDictionary.FItems) - 1 do
begin
Inc(FIndex);
if (FDictionary.FItems[FIndex].HashCode <> 0)
and not(FDictionary.FItems[FIndex].IsHidden) then // my filter
Exit(True);
end;
Result := False;
end;
Bu tam örnek için şimdi sayımcıların nasıl kullanılacağına dair daha iyi bir anlayışa sahibim. Ayrıca, sarmalayıcıların büyük bir performans cezasına sahip olduğunu da keşfettim (örnek uygulamamda, bir nesne sorgusu, herhangi bir filtre uygulamadan, sarılı numaralayıcı ile normal TDictionary sayımcısı, 3.3 ms (+% 50!) Ile 2.2 ms alır). – user315561
@ user315561, 2.2ms nedir? Modern bir işlemci üzerinde 2.2 msn çok uzun bir süre, muhtemelen bir şey hesapladıysanız; Ve bu, sarılmış numaralayıcı için 3.3 ms sonucunu eşit olarak yanlış yapar. –
İçeriğim dışında verilen rakamların uygun olmadığını kabul ediyorum. Kullanım durumu, basit bir eşitlik filtresi ile sıralı olarak taranan ve yeni bir sonuç koleksiyonuna eklenen 850 eşleşen nesne olan 75000 nesneden oluşan bir koleksiyon üzerinde bir sorgulamadır. Burada vurgulamak istediğim, sayımla alakalı olan ve iyi bilinen numaralayıcı sargısının (aynı kullanım durumunda) maliyet cezasıdır. – user315561