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)
您可以为其创建扩展方法 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)
我有一个可能有用的可怕建议.介绍一种扩展方法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方法非常可重复使用.