2013-07-29 8 views
5

Ho bisogno di scrivere una funzione in C# che utilizzi una java.util.Map e la converta in un dizionario C#. (Il progetto su cui sto lavorando utilizza IKVM utilizzare alcune classi Java in C#.)Il modo migliore per convertire una mappa Java in un dizionario in C#

Ho provato con un ciclo foreach (ad es foreach (java.util.Map.Entry in map) o foreach (string key in map.keySet()) per aggiungere l'elemento per elemento Dizionario, ma sembra che Java Maps and Sets non è enumerabile

Qual è il mio approccio migliore qui? Devo usare un java.util.Iterator? (Non sono contrario all'utilizzo di Java Iterator per principio, ma sembra che ci dovrebbe essere un modo più pulito, più "c-sharp-y".) Immagino di poter ottenere il set di chiavi, utilizzare il metodo Set toArray(), e iterare attraverso che, ma ancora una volta, non si sente "c-sharp- y ". Devo solo superare me stesso e fare una di quelle cose, o c'è un wa migliore y? (? O, di queste due opzioni, che è più efficiente in termini di tempo/spazio preso)

Per riferimento, ecco un abbozzo di quello che sto cercando di fare:

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

Come potete mescolare Java e C#? – jsalonen

+2

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

+0

Oh, giusto, buon punto. Lo aggiungerò alla domanda. – firechant

risposta

6

È possibile creare un metodo di estensione per 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

Grazie per l'aiuto! – firechant

5

ho Ho ricevuto un orribile suggerimento che potrebbe funzionare. Introdurre un metodo di estensione su Iterable (o Iterable<E> se è possibile, ma io sto assumendo farmaci generici in realtà non funzionano ...)

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

Quindi è possibile utilizzare LINQ:

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

I' Non sono sicuro che sia bello o del tutto sporco ... ma ovviamente il metodo ToEnumerable è molto riutilizzabile.

+0

Argomento interessante (qui fuori tema) è .. come fanno i generici java falsi a suonare insieme ai generici .Net reali usando IKVM? hai mai sperimentato con quello? –

+0

@HighCore: No, per niente. –

+0

Funziona sicuramente, anche se ho finito per fare una soluzione diversa. Grazie per l'aiuto. – firechant

Problemi correlati