0

我有以下字典:

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";

我怎样才能将上面的单词(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”。也可以在新字典上获得结果,或者只访问字典的第一个元素以获取/解析到罗马映射。

需要:目前,我一直在传递罗马值以转换其相关值,但现在,我将在字典中输入上面提供的与罗马数字映射的输入。因此,我需要根据给定的输入获取适当的数字并传递给 API 以将罗马数字转换为数字。

任何人都可以建议我将这些字典与其映射值合并的最佳方法吗,对于 linq 或任何方法都可以。

谢谢你

4

2 回答 2

1

真的不是特别清楚你在追求什么,但我怀疑这至少会有所帮助:

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”(等)可能出现在真实文本中,这不会做你想要的。您可能只想使用正则表达式在单词边界上执行替换。
  • 这目前将保留输入中的空格,因此您最终会得到“LL MaterialType1”而不是“LL MaterialType1”。
于 2013-07-25T18:30:35.967 回答
0

简单案例

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

例如:

“aspe aspe MaterialType1”

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

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);
}

复杂案例

请以它为例。您可以按如下方式实现“已翻译”的字符串键。

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 在他的回答中指出的那样,使用此代码片段,您可以在“已翻译”值之间保留空格,因此实际上并不是对这种情况的回答。

于 2013-07-25T18:31:31.577 回答