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

fir*_*ant 5 c# ikvm dictionary map

我需要在C#中编写一个函数,它接受java.util.Map并将其转换为C#字典.(我正在开发的项目使用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,但感觉应该有一个更干净,更"尖锐的"方式.)我想我可以得到keySet,使用Set方法toArray() ,并通过迭代,但再次,它不觉得"升C-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;
}
Run Code Online (Sandbox Code Playgroud)

I4V*_*I4V 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>();
Run Code Online (Sandbox Code Playgroud)
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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用LINQ:

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

我不确定这是好还是彻底犯规......但显然这种ToEnumerable方法非常可重复使用.