从Java世界到c#世界,有没有HashMap的对等物?如果没有,你推荐什么?
Dictionary可能是最接近的。System.Collections.Generic.Dictionary实现了System.Collections.Generic.IDictionary接口(类似于Java的Map接口)。
Dictionary
System.Collections.Generic.Dictionary
System.Collections.Generic.IDictionary
Map
你应该注意的一些显著差异:
put
get
myMap.put(key, value)
MyObject value = myMap.get(key)
[]
myDictionary[key] = value
MyObject value = myDictionary[key]
null
HashMap
ArgumentNullException
Add
ArgumentException
KeyNotFoundException
TryGetValue
MyObject值= null; 如果(! myDictionary。TryGetValue(key, out value)) {/* key不存在*/}
Dictionary's有一个ContainsKey方法,可以帮助处理前两个问题。
ContainsKey
查看MSDN上哈希表类的文档。
表示基于键的哈希代码组织的键和值对的集合。
另外,请记住,这不是线程安全的。
从c#等价于Java HashMap
我需要一个接受“null”键的字典,但似乎没有原生的字典,所以我自己写了一个。其实很简单。我继承了Dictionary,添加了一个私有字段来保存“null”键的值,然后重写了索引器。它是这样的:
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>
让我用一个"codaddict's algorithm"的例子来帮助你们理解
“字典< em > < / em > in c#”在平行宇宙中是“< em > Hashmap < / em > in Java”。
有些实现是不同的。请参阅下面的示例以更好地理解。
声明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#
从Codaddict的算法下面可以观察到一个整体示例。
Java中的codaddict算法:
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); } }
Codaddict的c#算法
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(); } }
答案是
字典
看看我的函数,它的简单添加使用了字典中最重要的成员函数
如果列表中包含duplicate项,则此函数返回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的回答。
放置“零”而不是零字符串。
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"); }
使用字典-它使用哈希表,但类型安全。
的Java代码
int a = map.get(key); //continue with your logic
最好是这样用c#编写的:
int a; if(dict.TryGetValue(key, out a)){ //continue with your logic }
通过这种方式,您可以在块内确定变量“a”的需求,并且如果稍后需要它,它仍然可以在块外访问。