Delphi 如何在Tstringlist中附加到给定字符串

Delphi 如何在Tstringlist中附加到给定字符串,delphi,append,tstringlist,Delphi,Append,Tstringlist,我正在创建电子邮件地址列表,通过将每个新电子邮件附加到现有的csv字符串中,在TStringlist中实现为csv字符串。如果MyStringlist[0]中的csv字符串已经包含我要添加的电子邮件,那么我将把它附加到MyStringlist[1]中。如果该字符串也包含它,那么我将把它附加到MyStringlist[2]中,依此类推,直到找到一个不包含它的字符串 例如,如果MyStringlist[0]和MyStringlist[1]都包含我要追加的电子邮件,但MyStringlist[2]尚不

我正在创建电子邮件地址列表,通过将每个新电子邮件附加到现有的csv字符串中,在TStringlist中实现为csv字符串。如果MyStringlist[0]中的csv字符串已经包含我要添加的电子邮件,那么我将把它附加到MyStringlist[1]中。如果该字符串也包含它,那么我将把它附加到MyStringlist[2]中,依此类推,直到找到一个不包含它的字符串

例如,如果MyStringlist[0]和MyStringlist[1]都包含我要追加的电子邮件,但MyStringlist[2]尚不存在,因此无法追加,则会出现问题

e、 g.我可能需要将“a.co.uk”添加到已经包含以下字符串的MyStringlist中

MyStringlist[0] -> a.co.uk, f.co.uk, h.co.uk, k.co.uk
MyStringlist[1] -> d.co.uk, a.co.uk, g.co.uk
我创建了一个过程,将电子邮件附加到给定索引处的字符串,或者在必要时在stringlist中创建一个新字符串

这段代码是正确的方法吗?或者我应该使用一些函数以一种更简单的方式来实现这一点,或者可能是一种更健壮的方式

创建的过程

procedure AppendToStringListItem(TheStringList: Tstringlist;
                                 Index : integer;
                                 StringToAppend : string);
var i : integer;
begin
if Index >= 0 then
  begin
  if TheStringList.count -1 < index then //not enough strings
    begin
    for i := 1 to index - TheStringList.Count  do  //add a blank string
       TheStringList.add('');
    TheStringList.add( StringToAppend); //add new string at position 'index'
    end
  else //just append
     TheStringList[Index] :=  TheStringList[Index] + ',' + StringToAppend
  end;
end;
程序附加到tringlistitem(TheStringList:Tstringlist;
索引:整数;
StringToAppend:字符串);
varⅠ:整数;
开始
如果索引>=0,则
开始
如果stringlist.count-1<索引,则//字符串不足
开始
对于索引-TheStringList.Count do//的i:=1,添加一个空字符串
字符串。添加(“”);
stringlist.add(StringToAppend)//在“索引”位置添加新字符串
结束
否则//只需附加
字符串[索引]:=字符串[索引]+','+字符串显示
结束;
结束;

没有内置函数来确保
TStrings
/
TStringList
具有最少数量的字符串。因此,是的,您必须一次手动添加一个字符串

我建议采取类似的措施:

程序附加到字符串(字符串:t字符串;
索引:整数;
StringToAppend:字符串);
变量
s:字符串;
开始
如果指数<0,则退出;
开始更新;
尝试
当索引>=字符串时,开始计数
字符串。附加(“”);
结束;
s:=字符串[索引];
如果s='',那么
s:=StringToAppend
其他的
s:=s+','+StringToAppend;
字符串[索引]:=s;
最后
TheStringList.EndUpdate;
结束;
结束;
但是,这确实需要您提前知道所需的索引,这意味着需要事先搜索
TStringList
,例如:

函数AlreadyExistsInStringListItem(const S,StringToAppend:string):布尔值;
开始
结果:=。。。;
结束;
功能查找索引出现在字符串中(字符串:t字符串;
StringToAppend:字符串);
开始
对于结果:=0到stringlist.Count-1 do
开始
如果StringListItem(字符串[Result],StringToAppend)中不存在,则
出口
结束;
结果:=字符串。计数;
结束;
附加于三角石的程序(三角石:三角石;
索引:整数;
StringToAppend:字符串);
变量
s:字符串;
开始
如果指数<0,则退出;
开始更新;
尝试
当索引>=字符串时,开始计数
字符串。附加(“”);
结束;
s:=字符串[索引];
如果s='',那么
s:=StringToAppend
其他的
s:=s+','+StringToAppend;
字符串[索引]:=s;
最后
TheStringList.EndUpdate;
结束;
结束;
Index:=FindIndexToAppendToStringListItem(TheStringList,'a.co.uk');
附录三级英语(三级英语,索引“a.co.uk”);
根据代码的设计,这可能会浪费开销。您可以通过合并搜索和插入来简化该逻辑,例如:

函数AlreadyExistsInStringListItem(const S,StringToAppend:string):布尔值;
开始
结果:=。。。;
结束;
附加于三角石的程序(三角石:三角石;
StringToAppend:字符串);
变量
i:整数;
s:字符串;
开始
开始更新;
尝试
对于i:=0到字符串。计数-1 do
开始
s:=字符串[i];
如果StringListItem中不存在StringToAppend,则
开始
字符串[i]:=s+','+StringToAppend;
出口
结束;
结束;
stringlist.Append(StringToAppend);
最后
TheStringList.EndUpdate;
结束;
结束;
AppendToStringListItem(TheStringList,'a.co.uk');

我知道我在这里挑剔,但是BeginUpdate/EndUpdate是没有意义的,因为实际上只有一个操作会改变字符串:赋值或追加。提前知道索引是可以的,因为我是从通过电子邮件排序的数据集中读取的,所以在while not eof循环中读取数据集时,有一个逻辑每次读取时都会增加一个批号获取一封重复的电子邮件,并使用该批号作为我想要的stringlist索引。然后,在到达副本末尾时,它会将批号重置回0,以便下一封电子邮件进入索引0@UweRaabe当然,对于
TStringList
。但是如果您注意到,我将输入参数从
TStringList
更改为
TStrings
,这将打开代码以处理所有类型的子体,例如
TMemo.Lines
,在这里使用
(Begin | End)Update()
更有意义,尤其是在一次进行多个更新时,喜欢多次调用
Append()
。谢谢你,雷米。至少我知道我没有错过一些简单的东西。在这种情况下,重要的是我要传递我想要使用的索引,因为我还需要将JSON数据的CSV字符串附加到同一索引的类似stringlist中。这将在同一索引处创建电子邮件批和相应的JSON mailmerge标头数据,以发送到批量emailer API,同时知道每个批不包含重复的电子邮件。(如果两个人