Xamarin.Android 迭代 Java.Util.HashMap

awe*_*pps 3 c# xamarin.android xamarin

有人知道在 Xamarin.Android 中迭代 Java HashMap 的最佳方法吗?根据文档,似乎在 EntrySet 上执行 foreach 应该在每次迭代时返回IMapEntry的实例,但是在执行以下操作时我得到了无效的转换:

foreach(Java.Util.IMapEntry entry in hashMap.EntrySet())
Run Code Online (Sandbox Code Playgroud)

或者,如果您更愿意告诉我如何将 HashMap 转换为 .Net 字典,那么也可以找到它,因为这是我的最终目标。

注意:这是专门针对 Xamarin.Android 的,它似乎不像建议的副本那么简单。

Sus*_*ver 5

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

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

假设您正在创建或接收一个简单的HashMap键/值(许多 Google Android API 使用简单的 HashMap 为其 Rest API 转换为 Json,即 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);
Run Code Online (Sandbox Code Playgroud)

JavaDictionaryHandlea创建a Hashmap

var jdictionaryFromHashMap = new Android.Runtime.JavaDictionary<string, string>(map.Handle, Android.Runtime.JniHandleOwnership.DoNotRegister);
Run Code Online (Sandbox Code Playgroud)

迭代JavaDictionary

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

使用 Linq 创建 C# 字典:

var dictionary = jdictionaryFromHashMap.ToDictionary(t => t.Key, t => t.Value);
Run Code Online (Sandbox Code Playgroud)