将C#Dictionary转换为C ++映射

时间:2018-06-07 11:25:38

标签: dictionary visual-c++ c++-cli stdmap

我收到一个从C#dll到C ++ / CLI代码的字典。我正在尝试将字典转换为std :: map,这将由旧的C ++代码进一步使用。但我无法做到。我有一个函数,它将字典作为参数并返回一个地图。

这就是我想要做的事情 -

std::map < std::wstring, std::map<int, int>> Convert(Dictionary<String^, Dictionary<int, int>^>^ myMap)
{
   std::map < std::wstring, std::map<int, int>> h_result;

   for (std::wstring& stringKey : myMap->Keys)
   {
       for (std::pair<int, int> intKey : (myMap->Values))
       {
           h_result.insert(stringKey, intKey);
       }
   }

return h_result;
}

我在迭代值时遇到错误。

  

错误:这个基于范围的'for'语句需要一个合适的“开始”功能,但没有找到

有谁能告诉我这里有什么问题?或者如果有更好的方法将Dictionary^转换为std::map,请建议我。

我是字典和std :: map的新手。如果示例代码有任何愚蠢的错误,请告诉我。

1 个答案:

答案 0 :(得分:1)

您(a)尝试使用带有Dictionary^的C ++ range-for循环,以及(b)尝试将系统类型与C ++标准类型互换使用。所有这些都没有奏效。

您需要更多地执行此操作:使用Dictionary^迭代for each集合,将String ^转换为std :: wstring properly,并创建使用std::make_pair映射项目。

所以你的功能看起来像这样(未经测试)

std::map <std::wstring, std::map<int, int>> Convert(Dictionary<String ^, Dictionary<int, int>^> ^myMap)
{
    std::map <std::wstring, std::map<int, int>> h_result;

    // iterate the outer dictionary
    for each(KeyValuePair<String ^, Dictionary<int, int>^> ^kvp1 in myMap)
        {
        std::wstring stringKey = marshal_as<std::wstring>(kvp1->Key);

        std::map<int, int> mapValues;

        // iterate the inner dictionary
        for each(KeyValuePair<int, int> ^kvp2 in kvp1->Value)
            {
            // insert in inner map
            mapValues.insert(std::make_pair(kvp2->Key, kvp2->Value));
            }

        // insert in outer map
        h_result.insert(std::make_pair(stringKey, mapValues));
        }

    return h_result;
}
相关问题