C#Java HashMap等价物

从一个Java世界到一个C#一个是否有一个HashMap的等价物? 如果不是,你会推荐什么?

Dictionary可能是最接近的。 System.Collections.Generic.Dictionary实现了System.Collections.Generic.IDictionary接口(类似于Java的Map接口)。

一些显着的差异,你应该知道的:

  • 添加/获取项目
    • Java的HashMap具有putget方法来设置/获取项目
      • myMap.put(key, value)
      • MyObject value = myMap.get(key)
    • C#的字典使用[]索引设置/获取项目
      • myDictionary[key] = value
      • MyObject value = myDictionary[key]
  • null
    • Java的HashMap允许空键
    • 如果您尝试添加空键,.NET的Dictionary将引发ArgumentNullException
  • 添加一个重复的密钥
    • Java的HashMap将用新的值代替现有的值。
    • 如果使用[]索引,.NET的Dictionary将会用新的replace现有的值。 如果你使用Add方法,它会抛出一个ArgumentException
  • 尝试获取不存在的密钥
    • Java的HashMap将返回null。
    • .NET的Dictionary将抛出一个KeyNotFoundException 。 您可以使用TryGetValue方法而不是[]索引来避免这种情况:
      MyObject value = null; if (!myDictionary.TryGetValue(key, value)) { /* key doesn't exist */ }

Dictionary有一个ContainsKey方法,可以帮助处理前两个问题。

从C#等同于Java HashMap

我需要一个接受一个“空”键的字典,但似乎没有本地的,所以我写了我自己的。 实际上这很简单。 我从字典inheritance,添加一个专用字段来保存“空”键的值,然后覆盖索引器。 它是这样的:

 public class NullableDictionnary : Dictionary<string, string> { string null_value; public StringDictionary this[string key] { get { if (key == null) { return null_value; } return base[key]; } set { if (key == null) { null_value = value; } else { base[key] = value; } } } } 

希望这有助于未来的人。

==========

我将其修改为这种格式

 public class NullableDictionnary : Dictionary<string, object> 

查看MSDN上Hashtable类的文档。

表示根据密钥的哈希码组织的键值对的集合。

另外请记住,这不是线程安全的。

让我通过一个“codaddict的algorithm”的例子来帮助你理解它

“C#中的字典 ”是并行Universe中的“Java中的Hashmap ”。

有些实现是不同的。 看下面的例子来更好地理解。

声明Java HashMap:

 Map<Integer, Integer> pairs = new HashMap<Integer, Integer>(); 

声明C#字典:

 Dictionary<int, int> Pairs = new Dictionary<int, int>(); 

从某个位置获取价值:

 pairs.get(input[i]); // in Java Pairs[input[i]]; // in C# 

在地点设置一个值:

 pairs.put(k - input[i], input[i]); // in Java Pairs[k - input[i]] = input[i]; // in C# 

从Codaddictalgorithm的下面可以看到一个整体例子。

Java中的codaddictalgorithm:

 import java.util.HashMap; public class ArrayPairSum { public static void printSumPairs(int[] input, int k) { Map<Integer, Integer> pairs = new HashMap<Integer, Integer>(); for (int i = 0; i < input.length; i++) { if (pairs.containsKey(input[i])) System.out.println(input[i] + ", " + pairs.get(input[i])); else pairs.put(k - input[i], input[i]); } } public static void main(String[] args) { int[] a = { 2, 45, 7, 3, 5, 1, 8, 9 }; printSumPairs(a, 10); } } 

C#中的Codaddictalgorithm

 using System; using System.Collections.Generic; class Program { static void checkPairs(int[] input, int k) { Dictionary<int, int> Pairs = new Dictionary<int, int>(); for (int i = 0; i < input.Length; i++) { if (Pairs.ContainsKey(input[i])) { Console.WriteLine(input[i] + ", " + Pairs[input[i]]); } else { Pairs[k - input[i]] = input[i]; } } } static void Main(string[] args) { int[] a = { 2, 45, 7, 3, 5, 1, 8, 9 }; //method : codaddict's algorithm : O(n) checkPairs(a, 10); Console.Read(); } } 

我想最好给个例子来说明一个最喜欢的..
所以检查这个集合,并决定你想要使用哪个集合。

答案是

字典

看看我的function,它的简单添加使用了Dictionary里面最重要的成员函数

如果列表包含Duplicates项目,则此函数返回false

  public static bool HasDuplicates<T>(IList<T> items) { Dictionary<T, bool> mp = new Dictionary<T, bool>(); for (int i = 0; i < items.Count; i++) { if (mp.ContainsKey(items[i])) { return true; // has duplicates } mp.Add(items[i], true); } return false; // no duplicates } 

我只是想给我两分钱。
这是根据@Powerlord的回答。

放置“空”而不是string。

 private static Dictionary<string, string> map = new Dictionary<string, string>(); public static void put(string key, string value) { if (value == null) value = "null"; map[key] = value; } public static string get(string key, string defaultValue) { try { return map[key]; } catch (KeyNotFoundException e) { return defaultValue; } } public static string get(string key) { return get(key, "null"); }