2013-07-29 19 views
5

में एक शब्दकोश में कनवर्ट करने का सबसे अच्छा तरीका मुझे सी # में एक फ़ंक्शन लिखना होगा जो java.util.Map में ले जाता है और इसे एक सी # शब्दकोश में परिवर्तित करता है। (परियोजना मैं पर काम कर रहा हूँ IKVM का उपयोग करता है सी # में कुछ जावा वर्गों का उपयोग करें।)जावा मानचित्र को सी #

मैं एक foreach पाश का उपयोग कर की कोशिश की है (जैसे foreach (java.util.Map.Entry in map) या foreach (string key in map.keySet()) शब्दकोश तत्व-दर-तत्व में जोड़ने के लिए, लेकिन ऐसा लगता है कि जावा मैप्स और सेट्स संख्यात्मक नहीं हैं।

मेरा सबसे अच्छा तरीका क्या है? क्या मुझे जावा.टिल.इटरेटर का उपयोग करना चाहिए? (मैं सिद्धांत पर जावा इटरेटर का उपयोग करने का विरोध नहीं कर रहा हूं, लेकिन ऐसा लगता है कि वहां होना चाहिए एक क्लीनर, अधिक "सी-तेज-वाई" तरीका।) मुझे लगता है कि मैं कीसेट प्राप्त कर सकता हूं, सेट विधि को एर्रे() का उपयोग कर सकता हूं, और के माध्यम से फिर से चला सकता हूं, लेकिन फिर से, यह "सी-तेज- वाई "। क्या मुझे बस अपने आप को प्राप्त करना चाहिए और उन चीजों में से एक करना चाहिए, या वहां एक बेहतर वा है 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

आप कैसे मिश्रण कर सकते हैं जावा और सी # के लिए एक विस्तार विधि बना सकते हैं? – 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

मैं कर दिया है: (? या, उन दो विकल्प है, जो समय के संदर्भ में और अधिक कुशल है की/अंतरिक्ष लिया गया)

संदर्भ के लिए, मैं क्या कर रहा हूँ का एक संक्षिप्त वर्णन है एक भयानक सुझाव मिला जो काम कर सकता है। LINQ Iterable पर एक विस्तार विधि का परिचय (या Iterable<E> यदि आप कर सकते हैं, लेकिन मैं वास्तव में जेनरिक काम नहीं करते संभालने हूँ ...)

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

तो आप का उपयोग कर सकते हैं:

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

मैं मुझे यकीन नहीं है कि यह अच्छा या पूरी तरह से गलत है ... लेकिन जाहिर है ToEnumerable विधि बहुत पुन: प्रयोज्य है।

+0

दिलचस्प विषय (यहां विषय-वस्तु) है .. नकली जावा जेनेरिक असली के साथ कैसे खेलते हैं .NET जेनेरिक IKVM का उपयोग करते हैं? क्या आपने कभी इसका प्रयोग किया है? –

+0

@ हाईकोर: नहीं, बिलकुल नहीं। –

+0

यह निश्चित रूप से काम करता है, हालांकि मैं एक अलग समाधान कर रहा हूं। सहायता के लिए धन्यवाद। – firechant

संबंधित मुद्दे