在此问题上分享代码作为参考:
Delphi TPair Exception
如何在不使用TPair的情况下从TObjectDictionary具体条目中检索键和值,并且不从列表中提取/删除/删除该对?
{$APPTYPE CONSOLE} uses SysUtils,Generics.Defaults,Generics.Collections; type TProduct = class private FName: string; procedure SetName(const Value: string); published public property Name: string read FName write SetName; end; type TListOfProducts = TObjectDictionary<TProduct,Integer>; { TProduct } procedure TProduct.SetName(const Value: string); begin FName := Value; end; var MyDict: TListOfProducts; MyProduct1: TProduct; MyProduct2: TProduct; MyProduct3: TProduct; APair: TPair<TProduct,Integer>; aKey: string; begin try MyDict := TListOfProducts.Create([doOwnsKeys]); MyProduct1 := TProduct.Create; MyProduct1.Name := 'P1'; MyProduct2 := TProduct.Create; MyProduct2.Name := 'P2'; MyProduct3 := TProduct.Create; MyProduct3.Name := 'P3'; MyDict.Add(MyProduct1,1); MyDict.Add(MyProduct2,2); MyDict.Add(MyProduct3,3); //the code to look for a **concrete product** (ie: MyProduct1) goes here.. Readln; except on E: Exception do Writeln(E.ClassName,': ',E.Message); end; end.
谢谢.
=========================
=代码与答案=
{$APPTYPE CONSOLE} uses SysUtils,Integer>; { TProduct } procedure TProduct.SetName(const Value: string); begin FName := Value; end; var MyDict: TListOfProducts; MyProduct1: TProduct; MyProduct2: TProduct; MyProduct3: TProduct; MySearchedProduct: TProduct; // From Answer. APair: TPair<TProduct,Integer>; aProductName: string; begin try MyDict := TListOfProducts.Create([doOwnsKeys]); MyProduct1 := TProduct.Create; MyProduct1.Name := 'P1'; MyProduct2 := TProduct.Create; MyProduct2.Name := 'P2'; MyProduct3 := TProduct.Create; MyProduct3.Name := 'P3'; MyDict.Add(MyProduct1,3); Writeln('Enter the Product Name to search: '); //the code to look for a **concrete product** goes here.. Readln(aProductName); for MySearchedProduct in Mydict.Keys do if (MySearchedProduct.Name = aProductName) then break; if MySearchedProduct.Name = aProductName then WriteLn('I have found the product: ' + MySearchedProduct.Name) else WriteLn('I have not found a product with that name.'); Readln; except on E: Exception do Writeln(E.ClassName,E.Message); end; end.
解决方法
您可以使用MyDict的“键和值”属性.
在这样的循环中:
var MyProduct: TProduct; Value: Integer; begin for Value in MyDict.Values do writeln(Value); for MyProduct in MyDict.Keys do writeln(MyProduct.Name);
或者使用ToArray的索引:
writeln(MyDict.Keys.ToArray[1].Name); writeln(MyDict.Values.ToArray[1]);