如何附加到 Tstringlist 中的给定字符串
How to append to a given string in a Tstringlist
我正在通过将每封新电子邮件附加到现有的 csv 字符串来创建在 TStringlist 中实现为 csv 字符串的电子邮件地址列表。如果 MyStringlist[0] 中的 csv 字符串已经包含我要添加的电子邮件,那么我会将其附加到 MyStringlist[1]。如果该字符串也已经包含它,那么我会将它附加到 MyStringlist[2] 等等,直到找到不包含它的字符串。
例如,如果 MyStringlist[0] 和 MyStringlist[1] 都包含我要附加的电子邮件,但 MyStringlist[2] 尚不存在,因此无法将其附加到。
例如我可能需要将 '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
我创建了一个过程,用于将电子邮件附加到给定索引处的字符串,或者在必要时在字符串列表中创建一个新字符串。
这段代码是正确的方法吗?我应该使用哪些函数以更简单的方式或更可靠的方式来做到这一点?
程序已创建
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;
没有内置函数来确保 TStrings
/TStringList
具有最少数量的字符串。所以是的,您必须一次手动添加一个字符串。
我建议更像这样:
procedure AppendToStringListItem(TheStringList: TStrings;
Index : integer;
StringToAppend : string);
var
s: string;
begin
if Index < 0 then Exit;
TheStringList.BeginUpdate;
try
while Index >= TheStringList.Count do begin
TheStringList.Append('');
end;
s := TheStringList[Index];
if s = '' then
s := StringToAppend
else
s := s + ',' + StringToAppend;
TheStringList[Index] := s;
finally
TheStringList.EndUpdate;
end;
end;
但是,这需要您提前知道所需的索引,这意味着事先搜索 TStringList
,例如:
function AlreadyExistsInStringListItem(const S, StringToAppend: string): Boolean;
begin
Result := ...;
end;
function FindIndexToAppendToStringListItem(TheStringList: TStrings;
StringToAppend : string);
begin
for Result := 0 to TheStringList.Count-1 do
begin
if not AlreadyExistsInStringListItem(TheStringList[Result], StringToAppend) then
Exit;
end;
Result := TheStringList.Count;
end;
procedure AppendToStringListItem(TheStringList: TStrings;
Index : integer;
StringToAppend : string);
var
s: string;
begin
if Index < 0 then Exit;
TheStringList.BeginUpdate;
try
while Index >= TheStringList.Count do begin
TheStringList.Append('');
end;
s := TheStringList[Index];
if s = '' then
s := StringToAppend
else
s := s + ',' + StringToAppend;
TheStringList[Index] := s;
finally
TheStringList.EndUpdate;
end;
end;
Index := FindIndexToAppendToStringListItem(TheStringList, 'a.co.uk');
AppendToStringListItem(TheStringList, Index, 'a.co.uk');
根据您的代码设计,这可能会浪费开销。您可以通过将搜索和插入合并在一起来简化该逻辑,例如:
function AlreadyExistsInStringListItem(const S, StringToAppend: string): Boolean;
begin
Result := ...;
end;
procedure AppendToStringListItem(TheStringList: TStrings;
StringToAppend : string);
var
i : integer;
s: string;
begin
TheStringList.BeginUpdate;
try
for i := 0 to TheStringList.Count-1 do
begin
s := TheStringList[i];
if not AlreadyExistsInStringListItem(s, StringToAppend) then
begin
TheStringList[i] := s + ',' + StringToAppend;
Exit;
end;
end;
TheStringList.Append(StringToAppend);
finally
TheStringList.EndUpdate;
end;
end;
AppendToStringListItem(TheStringList, 'a.co.uk');
我正在通过将每封新电子邮件附加到现有的 csv 字符串来创建在 TStringlist 中实现为 csv 字符串的电子邮件地址列表。如果 MyStringlist[0] 中的 csv 字符串已经包含我要添加的电子邮件,那么我会将其附加到 MyStringlist[1]。如果该字符串也已经包含它,那么我会将它附加到 MyStringlist[2] 等等,直到找到不包含它的字符串。
例如,如果 MyStringlist[0] 和 MyStringlist[1] 都包含我要附加的电子邮件,但 MyStringlist[2] 尚不存在,因此无法将其附加到。
例如我可能需要将 '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
我创建了一个过程,用于将电子邮件附加到给定索引处的字符串,或者在必要时在字符串列表中创建一个新字符串。
这段代码是正确的方法吗?我应该使用哪些函数以更简单的方式或更可靠的方式来做到这一点?
程序已创建
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;
没有内置函数来确保 TStrings
/TStringList
具有最少数量的字符串。所以是的,您必须一次手动添加一个字符串。
我建议更像这样:
procedure AppendToStringListItem(TheStringList: TStrings;
Index : integer;
StringToAppend : string);
var
s: string;
begin
if Index < 0 then Exit;
TheStringList.BeginUpdate;
try
while Index >= TheStringList.Count do begin
TheStringList.Append('');
end;
s := TheStringList[Index];
if s = '' then
s := StringToAppend
else
s := s + ',' + StringToAppend;
TheStringList[Index] := s;
finally
TheStringList.EndUpdate;
end;
end;
但是,这需要您提前知道所需的索引,这意味着事先搜索 TStringList
,例如:
function AlreadyExistsInStringListItem(const S, StringToAppend: string): Boolean;
begin
Result := ...;
end;
function FindIndexToAppendToStringListItem(TheStringList: TStrings;
StringToAppend : string);
begin
for Result := 0 to TheStringList.Count-1 do
begin
if not AlreadyExistsInStringListItem(TheStringList[Result], StringToAppend) then
Exit;
end;
Result := TheStringList.Count;
end;
procedure AppendToStringListItem(TheStringList: TStrings;
Index : integer;
StringToAppend : string);
var
s: string;
begin
if Index < 0 then Exit;
TheStringList.BeginUpdate;
try
while Index >= TheStringList.Count do begin
TheStringList.Append('');
end;
s := TheStringList[Index];
if s = '' then
s := StringToAppend
else
s := s + ',' + StringToAppend;
TheStringList[Index] := s;
finally
TheStringList.EndUpdate;
end;
end;
Index := FindIndexToAppendToStringListItem(TheStringList, 'a.co.uk');
AppendToStringListItem(TheStringList, Index, 'a.co.uk');
根据您的代码设计,这可能会浪费开销。您可以通过将搜索和插入合并在一起来简化该逻辑,例如:
function AlreadyExistsInStringListItem(const S, StringToAppend: string): Boolean;
begin
Result := ...;
end;
procedure AppendToStringListItem(TheStringList: TStrings;
StringToAppend : string);
var
i : integer;
s: string;
begin
TheStringList.BeginUpdate;
try
for i := 0 to TheStringList.Count-1 do
begin
s := TheStringList[i];
if not AlreadyExistsInStringListItem(s, StringToAppend) then
begin
TheStringList[i] := s + ',' + StringToAppend;
Exit;
end;
end;
TheStringList.Append(StringToAppend);
finally
TheStringList.EndUpdate;
end;
end;
AppendToStringListItem(TheStringList, 'a.co.uk');