2013-07-29 44 views
5

Tôi cần viết một hàm trong C# để lấy một java.util.Map và chuyển đổi nó thành một từ điển C#. (Dự án tôi đang làm việc trên sử dụng IKVM để sử dụng một số lớp Java trong C#.)Cách tốt nhất để chuyển đổi một bản đồ Java sang một từ điển trong C#

Tôi đã thử sử dụng vòng lặp foreach (ví dụ: foreach (java.util.Map.Entry in map) hoặc foreach (string key in map.keySet()) để thêm vào phần tử Từ điển theo yếu tố, nhưng có vẻ như Java Maps và Sets không được liệt kê

Cách tiếp cận tốt nhất của tôi ở đây là gì? Tôi có nên sử dụng một java.util.Iterator? (Tôi không phản đối sử dụng Java Iterator về nguyên tắc, nhưng nó cảm thấy như có nên một cách sạch hơn, "c-sắc nét-y") Tôi đoán tôi có thể lấy keySet, sử dụng phương thức Set toArray(), và lặp qua rằng, nhưng một lần nữa, nó không cảm thấy "c-sharp- y ". Tôi có nên vượt qua bản thân mình và làm một trong những điều đó hay không, hay là có một wa tốt hơn y? (? Hoặc, những hai lựa chọn, đó là hiệu quả hơn về thời gian/không gian chụp)

Để tham khảo, đây là một phác thảo về những gì tôi đang cố gắng để làm:

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

Làm thế nào bạn có thể trộn Java và C#? – jsalonen

+2

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

+0

Ồ đúng, điểm tốt. Tôi sẽ thêm nó vào câu hỏi. – firechant

Trả lời

6

Bạn có thể tạo một phương pháp mở rộng cho 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

Cảm ơn sự giúp đỡ! – firechant

5

Tôi đã có một đề xuất khủng khiếp mà có thể hoạt động. Giới thiệu một phương pháp khuyến nông trên Iterable (hoặc Iterable<E> nếu bạn có thể, nhưng tôi giả định Generics không thực sự làm việc ...)

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

Sau đó, bạn có thể sử dụng LINQ:

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

tôi m không chắc chắn cho dù đó là tốt đẹp hoặc hoàn toàn hôi ... nhưng rõ ràng là phương pháp ToEnumerable là rất tái sử dụng.

+0

Chủ đề thú vị (off-topic ở đây) là .. làm thế nào để giả mạo java Generics chơi cùng với Generics .Net bằng cách sử dụng IKVM? bạn đã bao giờ thử nghiệm với điều đó chưa? –

+0

@HighCore: Không, không hề. –

+0

Nó chắc chắn hoạt động, mặc dù tôi đã làm một giải pháp khác. Cảm ơn đã giúp đỡ. – firechant

Các vấn đề liên quan