#1 楼
Dictionary
可能是最近的。 System.Collections.Generic.Dictionary
实现了System.Collections.Generic.IDictionary
接口(类似于Java的Map
接口)。您应该注意一些明显的区别:
添加/获取项目
Java的HashMap具有用于设置/获取项目的
put
和get
方法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
将在新的密钥替换现有的值。您使用[]
索引。如果使用Add
方法,它将抛出ArgumentException
。尝试获取不存在的密钥
Java的
HashMap
将返回null。.NET的
Dictionary
将抛出KeyNotFoundException
。您可以使用TryGetValue
方法而不是[]
索引来避免这种情况:MyObject value = null;
if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }
两个问题。#2 楼
从C#到Java HashMap等效,我需要一本接受“空”键的字典,但是似乎没有本机键,因此我编写了自己的字典。实际上,这非常简单。我继承自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>
评论
您不能通过将对象作为类型参数来继续泛型主题吗?
–钴锂
2012-1-28的3:44
这行不通。 public StringDictionary this [string key] {...应该是public String this [string key] {。另外,我尝试使用base [key]无效。我建议实现IDictionary并仅具有一个全局私有字典对象并为每种方法处理null情况。
–.sharif
15年5月15日在21:40
我不知道您为什么不拼错字典。
–吉姆·巴尔特(Jim Balter)
15年7月22日在17:53
@JimBalter显然他需要一本字典。
–菲利普·埃尔姆(Phillip Elm)
17-2-5在23:32
#3 楼
让我用“ codaddict的算法”示例帮助您理解它。并行C#中的“ C#词典”是“ 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#
从下面的示例中可以看到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);
}
}
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();
}
}
#4 楼
请查阅MSDN上有关Hashtable类的文档。表示一个基于键的哈希码组织的键和值对的集合。
此外,请记住,这不是线程安全的。
评论
最好使用Dictionary
–胸腺素
09年8月13日在16:56
#5 楼
使用字典-它使用哈希表,但具有类型安全性。int a = map.get(key);
//continue with your logic
这样,您可以将变量“ a”的需要范围限定在一个块内,如果以后需要它,仍可以在该块外访问。 >
评论
自C#7.0起dict.TryGetValue(key,out int a)。
–nevvermind
20-10-12在15:23
#6 楼
答案是Dictionary
看看我的函数,它的简单添加使用了Dictionary中最重要的成员函数
如果列表包含重复项,则此函数返回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
}
#7 楼
我只想给我两美分。这是根据@Powerlord的回答。
输入“ null”而不是空字符串。
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中,HashMap允许空值和空键)download.oracle.com/javase/1.4.2/docs/api/java/util/…
–法比奥·毛洛(Fabio Maulo)
2010-12-25 18:55
是的,Dictionary接近但不准确。
– Powerlord
2010-12-25 21:00
注意,添加重复的键时,Dictionary会引发异常。
– Rubens Mariuzzo
2011年12月27日在20:08
此外,当请求不存在的键的值时,将引发异常。
– Rubens Mariuzzo
2011-12-27 20:20
请注意,如果TryGetValue返回false,则还将其类型的值设置为default(通常为0或null,这与HashMap返回的内容相似)。因此,如果对此感到满意,在某些情况下,您甚至不需要检查TryGetValue的布尔结果。
– Wizou
19年7月25日在10:41