在C#中将Java Map转换为Dictionary的最佳方法

时间:2013-07-29 22:44:16

标签: c# dictionary map ikvm

我需要在C#中编写一个函数,它接受java.util.Map并将其转换为C#Dictionary。 (我正在开发的项目使用IKVM在C#中使用一些Java类。)

我尝试过使用foreach循环(例如foreach (java.util.Map.Entry in map)foreach (string key in map.keySet())来逐个元素地添加到Dictionary中,但似乎Java Maps和Sets不可枚举。

这里最好的方法是什么?我应该使用java.util.Iterator吗? (我不反对原则上使用Java Iterator,但感觉应该有一个更干净,更“c-sharp-y”的方式。)我想我可以得到keySet,使用Set方法toArray() ,并迭代 ,但同样,它不会感觉“c-sharp-y”。我应该克服自己并做其中一件事,还是有更好的方法? (或者,在这两个选项中,在时间/空间方面效率更高?)

作为参考,这里是我正在尝试做的草图:

public Dictionary<string, object> convertMap(java.util.Map map)
{
    Dictionary<string, object> dict = new Dictionary<string, object>();
    foreach (String key in map.keySet()) // doesn't work; map is not enumerable
        dict.Add(key, map.get(key));
    return dict;
}

2 个答案:

答案 0 :(得分:7)

您可以为map to Dictionary

创建扩展方法
java.util.Map map = new java.util.HashMap();
map.put("a", 1);
map.put("b", 2);

var dict = map.ToDictionary<string, int>();

public static class JavaUtils
{
    public static Dictionary<K, V> ToDictionary<K, V>(this java.util.Map map)
    {
        var dict = new Dictionary<K, V>();
        var iterator = map.keySet().iterator();
        while (iterator.hasNext())
        {
            var key = (K)iterator.next();
            dict.Add(key, (V)map.get(key));
        }
        return dict;
    }
}

答案 1 :(得分:5)

我有一个可能工作的可怕建议。如果可以的话,在Iterable(或Iterable<E>上引入一种扩展方法,但我假设泛型不起作用......)

public static class JavaExtensions
{
    public static IEnumerable ToEnumerable(Iterable iterable)
    {
        var iterator = iterable.iterator();
        while (iterator.hasNext())
        {
            yield return iterator.next();
        }
    }
}

然后你可以使用LINQ:

public Dictionary<string, object> convertMap(java.util.Map map)
{
    return map.keySet()
              .ToEnumerable()
              .Cast<string>()
              .ToDictionary(key => key, key => map.get(key));
}

我不确定这是好还是完全犯规......但显然ToEnumerable方法非常可重用。