You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更简洁地从TStringList键值对中提取键名集合?

提取TStringList键名的更简洁方式

问题描述

我有一个包含2行内容的TStringList,内容如下:

aOldPriceTerms[0] = 'FuelAddition=336643160'
aOldPriceTerms[1] = 'Freight=336643155'

使用aOldPriceTerms.Values['Freight']可正常获取对应值'336643155'。我需要提取该列表中的所有键名,即得到集合:

'FuelAddition','Freight'

目前使用以下代码实现,其中aOldPriceTerms为实际TStringList实例:

function GetList(aOldPriceTerms: TStringList): String;
var
  vOldTerm : string;
  vOldTermsList : TStringList;
begin
  vOldTermsList := TStringList.Create;
  try
    for i := aOldPriceTerms.Count - 1 downto 0 do
    begin
      vOldTerm := Copy(aOldPriceTerms[i], 1, (Pos('=', aOldPriceTerms[i])-1));
      vOldTermsList.Add(vOldTerm);
    end;
    Result := vOldTermsList.CommaText;
  finally
    FreeAndNil(vOldTermsList);
  end;
end;

请问是否有更简洁的方式提取这些键名?

解决方案

当然有更简洁的实现方式!既然你的TStringList已经是键值对格式(可以通过Values属性正常取值),说明它的NameValueSeparator已经默认是=了,这时候可以直接利用TStringList的Names属性来获取每个索引对应的键名,完全不用自己写字符串截取逻辑。

优化版本1(保留TStringList拼接)

function GetList(aOldPriceTerms: TStringList): String;
var
  vOldTermsList : TStringList;
begin
  vOldTermsList := TStringList.Create;
  try
    for var i := 0 to aOldPriceTerms.Count - 1 do
      vOldTermsList.Add(aOldPriceTerms.Names[i]);
    Result := vOldTermsList.CommaText;
  finally
    FreeAndNil(vOldTermsList);
  end;
end;

优化版本2(直接拼接结果,无需额外TStringList)

function GetList(aOldPriceTerms: TStringList): String;
begin
  Result := '';
  for var i := 0 to aOldPriceTerms.Count - 1 do
  begin
    if i > 0 then Result := Result + ',';
    Result := Result + QuotedStr(aOldPriceTerms.Names[i]);
  end;
end;

这两种方式的优势在于:

  • 利用VCL内置的Names属性,自动处理到第一个NameValueSeparator(默认是=),避免手动截取字符串可能出现的错误(比如行内存在多个=的情况)
  • 代码结构更简洁,可读性更强,减少了手动字符串操作的冗余代码

内容的提问来源于stack exchange,提问作者Roland Bengtsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:50