计算备忘录中的特定文本(Delphi)

Bia*_*nca 1 delphi count filter tmemo

我有一个备忘录,里面有许多"芒果"系列,我想要计算它发现文本'芒果'的次数.

var
  f, mango: Integer;
begin
  mango := 0;
  for f := 0 to m0.lines.Count - 1 do
  begin
    if AnsiContainsStr(m0.lines[f], 'mango') then
    begin
      mango := mango + 1;
      m0.lines.Add(IntToStr(mango));
    end
  end;
end;
Run Code Online (Sandbox Code Playgroud)

但结果,例如,如果它发现六个'芒果'条目将是这样的:

1
2
3
4
5
6
Run Code Online (Sandbox Code Playgroud)

我怎么才有结果只有6?

Gra*_*ter 7

如果您只想要备忘录中显示的总数,那么您将需要这样做:

var
  f, mango: Integer;
begin
  mango := 0;
  for f := 0 to m0.lines.Count - 1 do
  begin
    if AnsiContainsStr(m0.lines[f], 'mango') then
    begin
      mango := mango + 1;
    end
  end;
  m0.lines.Add(IntToStr(mango));    // This line needs to be outside of your loop
end;
Run Code Online (Sandbox Code Playgroud)

每次增加时,您都会将计数添加到列表中.

如果你想要一个可重复使用的功能,你可以使用这样的东西:

function CountStringListTexts(const ASearchList: TStrings; const ASearchText: string): Integer;
var
  f: Integer;
begin
  Result := 0;
  for f := 0 to ASearchList.Count - 1 do
  begin
    if AnsiContainsStr(ASearchList[f], ASearchText) then
    begin
      Result := Result + 1;
    end
  end;
end;
Run Code Online (Sandbox Code Playgroud)

要使用它,您可以执行以下操作:

m0.lines.Add(IntToStr(CountStringListTexts(m0.Lines, 'mango')));
Run Code Online (Sandbox Code Playgroud)

这也可以成为一个类助手:

type
  TSClassHelper = class helper for TStrings
    function CountMatchTexts(const ASearchText: string): Integer;
  end;

function TSClassHelper.CountMatchTexts(const ASearchText: string): Integer;
var
  f: Integer;
begin
  Result := 0;
  for f := 0 to Self.Count - 1 do
  begin
    if AnsiContainsStr(Self.Strings[f], ASearchText) then
    begin
      Result := Result + 1;
    end
  end;
end;
Run Code Online (Sandbox Code Playgroud)

使用它非常容易.你会这样做:

m0.lines.Add(IntToStr(m0.Lines.CountMatchTexts('mango')));
Run Code Online (Sandbox Code Playgroud)

  • 如果您将过程更改为接受`TStrings`实例,那么您确实拥有一个没有VCL依赖关系的泛型函数 (2认同)