【问题标题】:How do i fill a TDictionay from a list of comma-separated string pairs?如何从逗号分隔的字符串对列表中填充 TDictionay?
【发布时间】:2012-12-21 08:28:45
【问题描述】:

我想要一个包含字符串列表的文本文件(例如,用逗号分隔的键和值可用于自动替换)并将每个键值对存储在TDictionary<string, string> 中。如何填充字典?

【问题讨论】:

标签: delphi tdictionary


【解决方案1】:

从您的评论看来,您似乎想知道如何将一些以逗号分隔的键值对提取到字典中。这是一个基本示例:

procedure PopulateKeyValueDict(Strings: TStrings;
  Dict: TDictionary<string, string>);
var
  CommaPos: Integer;
  Line: string;
  Key, Value: string;
begin
  for Line in Strings do
  begin
    CommaPos := Pos(',', Line);
    if CommaPos=0 then
      raise Exception.CreateFmt(
        'Could find comma separated key/value pair in ''%s''',
        [Line]
      );
    Key := Copy(Line, 1, CommaPos-1);
    Value := Copy(Line, CommaPos+1, MaxInt);
    Dict.Add(Key, Value);
  end;
end;

您可能想要添加更多错误检查等,但我假设您已经知道如何做到这一点。此示例说明在第一个逗号上分割一行,以及如何填充字典。

为了使用它,您需要将文件传输到TStrings 对象。这是例行公事:

var
  Strings: TStringList;
....
Strings := TStringList.Create;
try
  Strings.LoadFromFile(FileName);
  PopulateKeyValueDict(Strings, Dict);
finally
  Strings.Free;
end;

【讨论】:

  • 如何使用它来替换文本?
  • 这意味着在 SO 上一次一个问题。但是您需要遍历字典并对每一对进行字符串替换。您可以为此使用StringReplace 函数。
  • @David 也许他可以在加载文件和填充字典之间通过 StringList.Text 或 StringList.CommaText 执行 StringReplace
【解决方案2】:

如果你只有一对一的键值关系(不像三个关键词“apple”和“apples”和“McIntoshes”会变成“McIntosh”)——那么最简单的方法可能是使用 TStringList,前提是

  1. 你让你的文件完全符合Key=Value 行,而不是Key,Value
  2. 要么需要区分大小写,要么对文件使用大写。

那你用http://docwiki.embarcadero.com/Libraries/XE3/en/System.Classes.TStrings.Values

为了加快速度,您可以使用 IniFiles 单元的 THashedStringList。 JclXML 单元中的 JCL 也有类似的东西。

【讨论】:

  • 这也是一种很棒的方法,但我将拥有多个值的键。感谢您的建议!
  • @user1817376 如果这是awesome 但没有回答你的问题,你为什么接受它?恕我直言,大卫的回答非常适合您的问题,应该被接受。顺便说一句,使用 TStringList 您可以像 TDictionary 一样拥有许多具有相同值的键。只有键必须是唯一的
  • 我同意@SirRufo 的观点。当答案很棒时-通过投票来确认它。但是答案是否正确 - 这是一个单独的问题。我相信 - 如果这个答案脱离上下文,你最好做 1:通过明确拼写要求来解决你的问题,这会使我的答案不正确; 2:接受真正适用于你情况的答案。
猜你喜欢
  • 2020-10-19
  • 2023-03-17
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多