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

C# 用C语言将Java映射转换为字典的最佳方法#,c#,dictionary,map,ikvm,C#,Dictionary,Map,Ikvm,我需要用C语言编写一个函数,它接受java.util.Map并将其转换为C字典。(我正在研究的项目使用C#中的一些Java类。) 我尝试使用foreach循环(例如,foreach(java.util.Map.Entry in Map)或foreach(string key in Map.keySet())逐个元素添加到字典元素,但java映射和集合似乎不可枚举 这里我最好的方法是什么?我应该使用java.util.Iterator吗?(原则上我不反对使用java迭代器,但感觉应该有一种更干净、

我需要用C语言编写一个函数,它接受java.util.Map并将其转换为C字典。(我正在研究的项目使用C#中的一些Java类。)

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

这里我最好的方法是什么?我应该使用java.util.Iterator吗?(原则上我不反对使用java迭代器,但感觉应该有一种更干净、更“c-sharp-y”的方式。)我想我可以得到密钥集,使用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;
}
public Dictionary convertMap(java.util.Map)
{
Dictionary dict=新字典();
foreach(map.keySet()中的字符串键)//不工作;映射不可枚举
dict.Add(key,map.get(key));
返回命令;
}

我有一个可怕的建议,可能会奏效。在
Iterable
上引入一个扩展方法(或者
Iterable
,如果可以的话,但我假设泛型不起作用…)

然后您可以使用LINQ:

public Dictionary<string, object> convertMap(java.util.Map map)
{
    return map.keySet()
              .ToEnumerable()
              .Cast<string>()
              .ToDictionary(key => key, key => map.get(key));
}
public Dictionary convertMap(java.util.Map)
{
return map.keySet()
.可计算的()
.Cast()
.ToDictionary(key=>key,key=>map.get(key));
}

我不确定这是好是坏……但显然,
ToEnumerable
方法是可重用的。

您可以为
映射到字典创建一个扩展方法

java.util.Map map = new java.util.HashMap();
map.put("a", 1);
map.put("b", 2);

var dict = map.ToDictionary<string, int>();
java.util.Map=new java.util.HashMap();
地图放置(“a”,1);
地图放置(“b”,2);
var dict=map.ToDictionary();

公共静态类JavaUtils
{
公共静态字典ToDictionary(此java.util.Map)
{
var dict=新字典();
var iterator=map.keySet().iterator();
while(iterator.hasNext())
{
var key=(K)迭代器.next();
dict.Add(键,(V)map.get(键));
}
返回命令;
}
}

如何将Java和C#混合?@jsalonen哦,对了,观点很好。我会把它添加到问题中。@jsalonen
如何将Java和C#混合?
-这与其说是技术问题,不如说是一个伦理问题。从技术上说,你“可以”,比如把瑞士巧克力和泥混合在一起吃……有趣的话题(这里没有话题)是..如何使用IKVM将伪java泛型与真实的.Net泛型结合起来?你曾经尝试过吗?@HighCore:没有,一点也没有。它确实有效,尽管我最终使用了一个不同的解决方案。谢谢你的帮助。@firechant你最终使用了哪一个?因为没有比Jon Skeet的LIN更优雅的解决方案了Q方法。
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;
    }
}