Xamarin.Android迭代Java.Util.HashMap

时间:2017-08-13 20:49:00

标签: c# xamarin xamarin.android

任何人都知道在Xamarin.Android中迭代Java HashMap的最佳方法吗?根据{{​​3}},看起来在EntrySet上做一个foreach假设在每次迭代时都返回一个the docs的实例,但是在执行时我得到一个无效的强制转换:

foreach(Java.Util.IMapEntry entry in hashMap.EntrySet())

或者,如果您更愿意告诉我如何将HashMap转换为.Net字典,因为它是我的最终目标。

注意:这是针对Xamarin.Android的,它似乎并不像建议的副本那样直接。

1 个答案:

答案 0 :(得分:2)

HashMap.EntrySet()会返回ICollection以及无法转换为IMapEntry ....问题的该集合的项目?可能,但根本问题是尝试在C#中使用Java泛型,因此非泛型EntrySet()应返回HashMap.SimpleEntry(或SimpleImmutableEntry)的列表,但不会在Xamarin.Android中以这种方式映射。 ..

我通过使用Xamarin.Android运行时JavaDictionary(Android.Runtime.JavaDictionary)来解决这个问题,因为您可以将Hashmap“转换”为其通用版本并将其作为进行操作正常 C#泛型类。

假设您正在创建或接收简单的HashMap键/值(许多Google Android API使用简单的HashMaps将其转换为Json用于其Rest API,即Google Android Drive API使用了很多包含HashMap)

创建Java HashMap(这是来自POCO或POJO):

var map = new HashMap();
map.Put(nameof(uuid), uuid);
map.Put(nameof(name), name);
map.Put(nameof(size), size);

JavaDictionary的{​​{1}}创建Handle

Hashmap

迭代var jdictionaryFromHashMap = new Android.Runtime.JavaDictionary<string, string>(map.Handle, Android.Runtime.JniHandleOwnership.DoNotRegister);

JavaDictionary

使用Linq创建C#字典:

foreach (KeyValuePair<string, string> item in jdictionaryFromHashMap)
{
    Log.Debug("SO", $"{item.Key}:{item.Value}");
}