用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;
}
您可以为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方法是非常可重用的。