基于给定的“字典值”合并字典值的最佳方式是什么;键“;一串

本文关键字:字典 方式 是什么 最佳 一串 字典值 合并 | 更新日期: 2023-09-27 18:25:07

我有下面的字典:

Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("ship", "I");
d.Add("shep", "V");
d.Add("ssed", "X");
d.Add("aspe", "L");

下面是输入文本行:string line="挂船";

我如何才能最好地将上面的单词(shep、ship和ship)转换为上面字典中合适的罗马数字。对于上面的线,它应该显示为VII(shep-shep-ship)。

  Dictionary<string, int> dCost = new Dictionary<string, int>();
  dCost.Add("aspe aspe MaterialType1", 64);
  dCost.Add("ssed ssed MaterialType2", 5880);

我想把上面的dCost字典关键字aspe aspe MaterialType1转换成第一本字典中的适当罗马数字因此,上面的两行都应转换为LL MaterialType1,另一行应转换为"XX MaterialType2"。也可以在新字典上获得结果,或者只访问字典的第一个元素来获取/解析到罗马映射。

需要:目前,我一直在传递ROMAN值来转换其相关值,但现在,我将在映射ROMAN编号的字典中输入如上所述的内容。因此,我需要根据给定的输入获取适当的数字,并传递给API,以便将罗马转换为数字

有人能给我建议将这些字典与其映射值合并的最佳方法吗?这对linq或任何方法都很好。

谢谢

基于给定的“字典值”合并字典值的最佳方式是什么;键“;一串

确实不太清楚你想要什么,但我怀疑这至少会有所帮助:

public static string ReplaceAll(string text,
                                Dictionary<string, string> replacements)
{
    foreach (var pair in replacements)
    {
        text = text.Replace(pair.Key, pair.Value);
    }
    return text;
}

注:

  • 如果"shep"(etc)可以出现在实际文本中,这将不会达到您想要的效果。您可能希望使用正则表达式仅在单词边界上执行替换
  • 这将当前保留输入中的空格,因此您最终会使用"L L MaterialType1"而不是"LL MaterialType 1"

简单案例

如果我们假设成本关键字总是以一个单词结尾(即材料类型1),则关键字中的最后一个空格将要翻译的文本与材料类型名称分隔开。

例如:

"aspe aspe Material Type1"

若要翻译此字符串,可以使用类似于以下代码片段的内容。

foreach(var cost in dCosts)
{
    int lastSpaceIndex = cost.Key.LastIndexOf(" ");
    string materialTypeName = cost.Key.Substring(lastSpaceIndex + 1)
                                      .Trim();
    string translatedKey = cost.Key.Substring(0, lastSpaceIndex);
    foreach (var translation in d)
    {
        translatedKey = translatedKey.Replace(translation.Key, translation.Value)
                                     .Trim();
    }
    translatedKey = translatedKey.Replace(" ", string.Empty);       
    Console.WriteLine("{0} {1} cost is {2}", 
                      translatedKey,
                      materialTypeName,
                      cost.Value);
}

复杂案例

请把它当作一个例子。您可以按如下方式实现"translated"字符串键。

foreach(var cost in dCosts)
{
    string translatedKey = cost.Key;
    foreach (var translation in d)
    {
        translatedKey = translatedKey.Replace(translation.Key, translation.Value)
                                     .Trim();
    }
    Console.WriteLine("{0} cost is {1}", translatedKey, cost.Value);
}

正如@JonSkeet在他的回答中指出的那样,通过这个代码片段,您可以在"翻译"的值之间保留空格,因此这并不是对这种情况的真正回答。