如何附加到Tstringlist(Delphi)中的给定字符串

问题描述 投票:0回答:1

我通过将每个新电子邮件附加到现有的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;
delphi append tstringlist
1个回答
1
投票

没有内置函数来确保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');
© www.soinside.com 2019 - 2024. All rights reserved.