如何将指定字符串拆分并存储到二维Dictionary<Language, Dictionary<string, string>>中
如何拆分字符串并填充到二维字典中
没问题,我来帮你梳理清楚整个逻辑,一步步实现字符串拆分和二维字典的填充。首先咱们先明确核心目标:把Content里的每个ID条目拆分成法语和英语翻译,分别存入对应Language枚举的内层字典中。
第一步:初始化二维字典
首先,你需要先给二维字典的每个Language枚举值初始化对应的内层字典,不然直接添加会报错。比如:
// 初始化外层字典,为每种语言创建内层字典 var items = new Dictionary<Language, Dictionary<string, string>> { { Language.French, new Dictionary<string, string>() }, { Language.English, new Dictionary<string, string>() } };
第二步:拆分整个Content为独立的ID条目
你的Content格式是ID_XXX==>法语翻译---英语翻译 ID_YYY==>法语翻译---英语翻译,这里的关键是不能直接按空格拆分(因为翻译内容里可能有空格,比如Joueur 1),所以推荐用正则表达式来匹配每个完整的ID条目。正则可以写成ID_\w+==>.+?---.+?(?=\sID_|$),它的作用是匹配从ID_开始,到下一个ID_或者字符串结尾的完整条目。
代码实现:
using System.Text.RegularExpressions; // 先清理Content里的多余空格(比如开头的空格) string cleanedContent = Content.Trim(); // 匹配所有ID条目 var entryMatches = Regex.Matches(cleanedContent, @"ID_\w+==>.+?---.+?(?=\sID_|$)"); if (entryMatches.Count == 0) { return ErrorCode.BAD_FILE_FORMAT; // 没有找到任何有效条目 }
第三步:拆分每个条目并填充字典
对于每个匹配到的条目,我们需要分两次拆分:
- 用
==>拆分,得到ID和翻译部分 - 用
---拆分翻译部分,得到法语和英语内容
然后把ID和对应翻译添加到对应语言的内层字典中,同时要做错误检查(比如拆分后部分缺失)。
代码片段:
foreach (Match match in entryMatches) { string entry = match.Value; // 第一步:拆分ID和翻译内容 string[] idAndTranslations = entry.Split(new[] { "==>" }, StringSplitOptions.None); if (idAndTranslations.Length != 2) { return ErrorCode.BAD_FILE_FORMAT; // 格式错误,没有==>分隔符 } string id = idAndTranslations[0].Trim(); string translationsPart = idAndTranslations[1].Trim(); // 第二步:拆分法语和英语翻译 string[] langTranslations = translationsPart.Split(new[] { "---" }, StringSplitOptions.None); if (langTranslations.Length != 2) { return ErrorCode.BAD_FILE_FORMAT; // 格式错误,没有---分隔符 } string frenchText = langTranslations[0].Trim(); string englishText = langTranslations[1].Trim(); // 检查翻译内容是否为空 if (string.IsNullOrEmpty(frenchText) || string.IsNullOrEmpty(englishText)) { return ErrorCode.MISSING_FIELD; // 缺失翻译内容 } // 填充到字典中 items[Language.French].Add(id, frenchText); items[Language.English].Add(id, englishText); }
第四步:整合完整的Parse方法
把上面的步骤整合到你的Parse方法里,注意处理各种错误情况,最后返回ErrorCode.OK表示成功:
using System.Text.RegularExpressions; public ErrorCode Parse() { string Content = "ID_PLAYER_1==>Joueur 1---Player 1 ID_AMMO==>Muni---Ammo"; // 初始化二维字典 var items = new Dictionary<Language, Dictionary<string, string>> { { Language.French, new Dictionary<string, string>() }, { Language.English, new Dictionary<string, string>() } }; // 清理内容并匹配条目 string cleanedContent = Content.Trim(); var entryMatches = Regex.Matches(cleanedContent, @"ID_\w+==>.+?---.+?(?=\sID_|$)"); if (entryMatches.Count == 0) { return ErrorCode.BAD_FILE_FORMAT; } foreach (Match match in entryMatches) { string entry = match.Value; string[] idAndTranslations = entry.Split(new[] { "==>" }, StringSplitOptions.None); if (idAndTranslations.Length != 2) { return ErrorCode.BAD_FILE_FORMAT; } string id = idAndTranslations[0].Trim(); string translationsPart = idAndTranslations[1].Trim(); string[] langTranslations = translationsPart.Split(new[] { "---" }, StringSplitOptions.None); if (langTranslations.Length != 2) { return ErrorCode.BAD_FILE_FORMAT; } string frenchText = langTranslations[0].Trim(); string englishText = langTranslations[1].Trim(); if (string.IsNullOrEmpty(frenchText) || string.IsNullOrEmpty(englishText)) { return ErrorCode.MISSING_FIELD; } // 这里如果ID重复的话会抛出异常,你可以根据需求处理,比如用TryAdd // items[Language.French].TryAdd(id, frenchText); items[Language.French].Add(id, frenchText); items[Language.English].Add(id, englishText); } // 如果需要把items作为类的成员变量保存,这里赋值:this.items = items; return ErrorCode.OK; }
一些额外的注意点
- 如果你需要处理ID重复的情况,推荐用
TryAdd方法代替Add,避免抛出异常:items[Language.French].TryAdd(id, frenchText) - 正则表达式可以根据实际的ID格式调整,如果ID里有特殊字符,比如下划线以外的符号,需要修改
\w为对应的匹配规则 - 清理内容的时候,除了
Trim(),还可以考虑替换多个连续空格为单个空格,避免条目之间的分隔问题
内容的提问来源于stack exchange,提问作者Scary Monsters
相关产品推荐
相关产品推荐

