के रिकॉर्ड के लिए टूट गया है, तो यह समस्या reproduces:TDictionary हैशिंग तार
program Project1;
{$APPTYPE CONSOLE}
uses
Generics.Collections;
type
TStringRec = record
s1 : string;
s2 : string;
end;
TGetHash<TKey,TValue> = class(TEnumerable<TPair<TKey,TValue>>)
public
type
TItem = record
HashCode: Integer;
Key: TKey;
Value: TValue;
end;
TItemArray = array of TItem;
public
FItems: TItemArray;
end;
var
LCrossRef : TDictionary<TStringRec, integer>;
LRec : TStringRec;
i : integer;
begin
LCrossRef := TDictionary<TStringRec, integer>.Create();
LRec.s1 := 'test1';
LRec.s2 := 'test2';
LCrossRef.Add(LRec, 1);
LRec.s1 := 'test1';
LRec.s2 := 'test2';
if LCrossRef.TryGetValue(LRec, i) then begin
writeln('ok');
end else begin
LCrossRef.Add(LRec, 1);
for i := Low(TGetHash<TStringRec, integer>
(LCrossRef).FItems)
to High(TGetHash<TStringRec, integer>
(LCrossRef).FItems) do
WriteLn(TGetHash<TStringRec, integer>(LCrossRef).FItems[i].HashCode);
WriteLn('not ok');
end;
ReadLn;
end.
शब्दकोश आइटम को पुनः प्राप्त करने में विफल रहता है और समान तार युक्त रिकॉर्ड के लिए एक अलग HashCode
उत्पन्न करता है।
यह आंशिक रूप से QC-#122791 में उल्लेख किया है, लेकिन वैकल्पिक हल पैक रिकॉर्ड का उपयोग करने के लिए तार के रिकॉर्ड के लिए काम नहीं करता है (कम से कम ऊपर के उदाहरण भी जब TStringRec
packed record
के रूप में घोषित किया जाता है विफल रहता है)।
क्या इसके लिए कोई समझदार कामकाज है?
मेरी वर्तमान रणनीति उन तारों को जोड़ना है जो अन्यथा रिकॉर्ड में शामिल हो जाती हैं और इसके बजाय TDictionary<string, TValue>
का उपयोग करती हैं, लेकिन यह स्वाभाविक रूप से असंतुष्ट है।
एक कस्टम IEqualityComparer के साथ TObjectDictionary का उपयोग करने के बारे में कैसे है जो आपके विशिष्ट प्रकार के लिए GetHashCode लागू करता है? –
@VilleKrumlinde आप 'TObjectDictionary' का मतलब नहीं है। यहां कोई ऑब्जेक्ट स्वामित्व नहीं है। –
'IEqualityComparer' को लागू करना निश्चित रूप से जाने का एक तरीका है। –