【问题标题】:TDictionary multiple output?TDictionary 多输出?
【发布时间】:2016-02-10 13:07:14
【问题描述】:

TDictionary 中是否可以存储多个项目?我想要一个简单的下一个解决方案

我的桌子是这样的:

  • LOCATION_ID、城市、邮政编码
  • 1,英格兰,2000
  • 2,匈牙利,1000
  • 3 , 土耳其, 300
  • 4 , 德国, 5000 等等...

我想存储表中的所有字段,并在其中搜索项目之后.. TDictionary 有能力吗?我有一个悖论表,Query 是一个简单的 TQuery

我用 2 个字段做了一个小例子

  var
  stSearch: string;
  vPDX: TDictionary<String, TCity>;
  variable: string; 

  stSearch := '4';
  vPDX := TDictionary<String, String>.Create;      qry_TMP.DatabaseName := 'C:\S_DATABASE';
  qry_TMP.SQL.Text := 'select * from SAMPLE_TABLE';
  qry_TMP.Open;

 while not qry_TMP.Eof do
   begin
   vPDX.AddOrSetValue(qry_TMP.FieldByName('LOCATION_ID').AsString,  qry_TMP.FieldByName('Location').AsString);    
qry_TMP.Next;
end;

if vPDX.TryGetValue(stSearch, variable) then
  showmessage(variable);

此代码有效,但我还需要另一个字段 (ZIP_CODE)。

我在 Class 中尝试过,但我只得到了 Table 中的最后一项。

 TSampleClass = class
 ZIP_CODe: String;
 Location: String;
 end;

  var
  SampleClass, Value: TSampleClass;
  vPDX := TDictionary<String, TSampleClass>.Create;

  begin

  stSearch := '4';
  SampleClass := TSampleClass.Create;
  vPDX := TDictionary<String, TSampleClass>.Create;  
  qry_TMP.DatabaseName := 'C:\S_DATABASE';
  qry_TMP.SQL.Text := 'select * from SAMPLE_TABLE';
  qry_TMP.Open;

while not qry_TMP.Eof do
  begin
  vPDX.AddOrSetValue(qry_TMP.FieldByName('LOCATION_ID').AsString, SampleClass);     
  SampleClass.ZIP_CODE := Qry_TMP.FieldByName('ZIP_CODE').AsString;
  SampleClass.City := Qry_TMP.FieldByName('City').AsString;
  qry_TMP.Next;
  end;

if vPDX.TryGetValue(stSearch, SampleClass) then
  showmessage(SampleClass.ZIP_CODE + SampleClass.City);

任何人都可以帮助解决什么问题?我想要德国和 5000 ZIP_CODE。我想学习如何使用 TDictionary。感谢您的帮助!

【问题讨论】:

    标签: delphi delphi-xe delphi-xe7


    【解决方案1】:

    您只拨打了一次tSampleClass.Create

    将它移到WHILE 语句中,以便为每条记录创建一个新实例。

    【讨论】:

    • 哇哦!:) 感谢您的帮助!
    【解决方案2】:

    您只创建一个SampleClass 实例,这意味着每次后续使用都会覆盖它包含的值。您需要为字典中的每个添加项创建一个新实例。

    while not qry_TMP.Eof do
    begin
      SampleClass := TSampleClass.Create;
      SampleClass.ZIP_CODE := qry_TMP.FieldByName('ZIP_CODE).AsString;
      SampleClass.City := qry_TMP.FieldByName('City').AsString;
      vPDX.AddOrSetValue(qry_TMP.FieldByName('LOCATION_ID', SampleClass);
      qry_TMP.Next;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 2011-07-15
      • 2015-02-15
      相关资源
      最近更新 更多