如何更简洁地从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
相关产品推荐
相关产品推荐

