任何人都知道在Xamarin.Android中迭代Java HashMap的最佳方法吗?根据{{3}},看起来在EntrySet上做一个foreach假设在每次迭代时都返回一个the docs的实例,但是在执行时我得到一个无效的强制转换:
foreach(Java.Util.IMapEntry entry in hashMap.EntrySet())
或者,如果您更愿意告诉我如何将HashMap转换为.Net字典,因为它是我的最终目标。
注意:这是针对Xamarin.Android的,它似乎并不像建议的副本那样直接。
答案 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)
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
foreach (KeyValuePair<string, string> item in jdictionaryFromHashMap)
{
Log.Debug("SO", $"{item.Key}:{item.Value}");
}