用C#将Java映射转换为字典的最佳方法

本文关键字:字典 最佳 方法 转换 Java 映射 | 更新日期: 2023-09-27 18:25:21

我需要用C#编写一个函数,该函数接收java.util.Map并将其转换为C#字典。(我正在进行的项目使用IKVM来使用C#中的一些Java类。)

我尝试过使用foreach循环(例如foreach (java.util.Map.Entry in map)foreach (string key in map.keySet()))逐元素添加到Dictionary中,但Java映射和集合似乎是不可枚举的

我最好的方法是什么?我应该使用java.util.Iterator吗?(原则上我并不反对使用Java迭代器,但我觉得应该有一种更干净、更"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;
}

用C#将Java映射转换为字典的最佳方法

您可以为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;
    }
}

我有一个可怕的建议,可能有效。在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));
}

我不确定这是好是坏。。。但显然CCD_ 6方法是非常可重用的。