【问题标题】:Xamarin.Android iterate Java.Util.HashMapXamarin.Android 迭代 Java.Util.HashMap
【发布时间】:2017-08-14 09:44:28
【问题描述】:

有人知道在 Xamarin.Android 中迭代 Java HashMap 的最佳方法吗?根据the docs,似乎在EntrySet 上执行foreach 应该在每次迭代时返回IMapEntry 的实例,但这样做时我得到一个无效的演员:

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

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

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

【问题讨论】:

  • Iterate through a HashMap的可能重复
  • @JonDouglas 我确实看过,但无法将其翻译成 C#/Xamarin
  • 如果不能强制转换为 IMapEntry,调试器说它实际上是什么类型?
  • @Jason Java.Util.HashMap.HashMapEntry,我无法弄清楚如何转换为。我在使用 JavaCast 方面取得了一些进展,但仍在努力。如果/当我想出完整的东西时,我当然会发布答案。

标签: c# xamarin xamarin.android


【解决方案1】:

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

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

假设您正在创建或接收一个简单的 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);

HashmapHandle 创建一个JavaDictionary

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}");
}

使用 Linq 创建您的 C# 字典:

var dictionary = jdictionaryFromHashMap.ToDictionary(t => t.Key, t => t.Value);

【讨论】:

    猜你喜欢
    • 2022-08-18
    • 2013-09-13
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2021-08-24
    • 2016-10-22
    相关资源
    最近更新 更多