如何创建“字符串集”?

问题描述 投票:7回答:5

您熟悉此块:

Var
  mySet: Set Of Char;
  C: Char;
begin
  mySet := ['a', 'b', 'c'];
  If C In mySet Then ShowMessage('Exists');
end;

有什么方法可以声明Set Of STRING?还是可以使用类似的代码代替?该块的重要部分是If C In mySet Then ShowMessage('Exists');我想对一组字符串使用类似的内容。谢谢。

delphi delphi-7
5个回答
8
投票

您可以利用它。

type 
  TAnyEnum = (aeVal1, aeVal2, aeVal3);
  TEnuns = set of TAnyEnum;
  TAnyMessages: array [TAnyEnum] of String;

const 
  MyMessages: TAnyMessages = ('Exists', 'Something else', 'WTF!?');

var
  MySet : TEnums;
begin
  MySet = [aeVal1, aeVal2];
  If aeVal1 in MySet then ShowMessage(MyMessages[aeVal1]);
end;

11
投票

集是使用位数组实现的。因此,不能,您不能拥有“字符串集”。使用TStringList代替,即:

var 
  mySet: TStringList;
  S: String;
begin 
  S := ...;
  mySet := TStringList.Create;
  try
    mySet.Add('a');
    mySet.Add('b');
    mySet.Add('c'); 
    if mySet.IndexOf(S) <> -1 Then ShowMessage('Exists');
  finally
    mySet.Free;
  end;
end; 

5
投票

RTL System.StrUtils单元为此提供了一种非常有趣的方法:

function MatchText(const AText: string; const AValues: array of string): Boolean; overload;

像这样使用它:

  if MatchText(sLanguages, ['fr-FR', 'en-GB', 'de-DE', 'it-IT', 'fr-CH', 'es-ES']) then
    Writeln('found')

3
投票

很遗憾,但是Delphi仍然没有非常基本的数据结构,例如集合。建议“ Fabricio Araujo”的用法非常有限-您必须知道所有可能的字符串,因此当您从某个地方读取它们时没有用。在这样的“几乎是字符串集”中,也不可能有超过256个项目。 Remy Lebeau建议使用TStringList来实现此目的,但是当您拥有大集合时,这绝对是无效的。在现代版本的Delphi中,可以使用TDictionary保留无序的任何内容集,包括字符串:

procedure TForm6.FormCreate(Sender: TObject);
type
  TEmpty = record end;
var
  MySet: TDictionary<String, TEmpty>;
  Dummy: TEmpty;
begin
  MySet := TDictionary<String, TEmpty>.Create;
  try
    MySet.Add('Str1', Dummy);
    MySet.Add('Str2', Dummy);
    MySet.Add('Str3', Dummy);
    if MySet.TryGetValue('Str2', Dummy) then
      ShowMessage('Exists');;
  finally
    MySet.Free;
  end;
end;

区分大小写。如果需要不区分大小写的实现,则可以在放置/查找之前将所有字符串都小写,然后放入集合中(使用AnsiLowerCase函数)。


1
投票

Fabricio Araujo发布了对原始问题的最佳答案。但是如果你问这个问题,你也应该问自己“我only是否需要知道Str是否在此Set中?”。

关于“月份名称的允许缩写集中是否有MonthAbbr?”的问题。您的下一个问题很可能是“那么,是哪个月?”。

    您的代码应在一个函数调用中回答两个问题。 (例如,返回月份编号,否则返回0)

  • 应为
  • 可读
  • 。立即将intent告知代码维护者。应将允许的字符串存储在代码中的单个
  • obvious
  • 位置。
    应允许轻松修改(“添加“秋天”和“秋天”,并在15分钟内将其恢复给我。”)。
  • 对于集合的预期大小合理有效。
  • 如果可能,请使用标准库(VCL)。否则使用外部库。
  • 如果您的代码经常执行此类操作,请将字符串与实现分开,然后将实现放在一个位置,以便可以对其进行彻底更改。
  • 所以您的代码可能会读取case GetMonthNumber(Str) of 0: //Error: Str is not a Month Name or Abbreviation 1: //etc.

    对于实现,最简单的一般答案是在Delphi 7中使用排序的TStringList(因为标记了问题)。

  • © www.soinside.com 2019 - 2024. All rights reserved.