2013-07-29 8 views
5

C#でjava.util.Mapを受け取り、それをC#辞書に変換する関数を書く必要があります。 (私が働いているプロジェクトは、C#でいくつかのJavaクラスを使用するようにIKVMを使用しています。)JavaマップをC#で辞書に変換する最も良い方法

私は辞書要素ごとに追加するforeachループ(例えばforeach (java.util.Map.Entry in map)またはforeach (string key in map.keySet())を使用して試してみたが、それはそうですJavaマップとセットは列挙できません。

ここで私の最善のアプローチは何ですか?java.util.Iteratorを使用する必要がありますか(私は原則としてJava Iteratorを使用することに反対していませんが、私はkeySetを取得し、SetメソッドtoArray()を使用して、を反復して、という文字列を繰り返しますが、やはり "c-sharp-y"私はちょうど自分自身を乗り越えて、それらの事の一つをしなければなりませんか、またはより良いWAがありますか? 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; 
} 
+1

どのようにJavaとC#を混在させることができますための拡張メソッドを作成することができますか? – jsalonen

+2

@jsalonen [IKVM](http://www.ikvm.net/) – I4V

+0

ああ、良い点。それを質問に追加します。 – firechant

答えて

6

あなたはmap to Dictionary

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; 
    } 
} 
+0

助けてくれてありがとう! – firechant

5

私はしましたかもしれないが役に立ったという恐ろしい示唆を得ました。

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

私は:次に、あなたがLINQを使用することができます

public static class JavaExtensions 
{ 
    public static IEnumerable ToEnumerable(Iterable iterable) 
    { 
     var iterator = iterable.iterator(); 
     while (iterator.hasNext()) 
     { 
      yield return iterator.next(); 
     } 
    } 
} 

(...あなたができる場合はIterable<E>が、私は、ジェネリック医薬品が実際に動作しないと仮定しています)Iterableに拡張メソッドを導入それが素晴らしく、まったくファウルであるかどうかは分かりませんが、明らかにToEnumerableメソッドは非常に再利用可能です。

+0

興味深い話題(ここで話題にはなりません)は... IKVMを使って、実際の.Netジェネリックスと一緒に偽のJavaジェネリックスを演奏する方法は?あなたはこれまでに実験したことがありますか? –

+0

@HighCore:いいえ、全くありません。 –

+0

それは確かにうまくいくが、私は別の解決策をとった。助けてくれてありがとう。 – firechant

関連する問題