5

我需要在 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 迭代器,但感觉应该有一个更干净、更“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;
}
4

2 回答 2

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;
    }
}
于 2013-07-29T23:27:35.563 回答
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方法是非常可重用的。

于 2013-07-29T22:58:52.167 回答