C# 中的 Java Map 等效项
Posted
技术标签:
【中文标题】C# 中的 Java Map 等效项【英文标题】:Java Map equivalent in C# 【发布时间】:2010-10-15 20:01:52 【问题描述】:我正在尝试使用我选择的键来保存集合中的项目列表。在 Java 中,我会简单地使用 Map,如下所示:
class Test
Map<Integer,String> entities;
public String getEntity(Integer code)
return this.entities.get(code);
在 C# 中是否有等效的方法?
System.Collections.Generic.Hashset
不使用哈希,我无法定义自定义类型键
System.Collections.Hashtable
不是泛型类System.Collections.Generic.Dictionary
没有 get(Key)
方法
【问题讨论】:
【参考方案1】:你可以索引字典,你不需要'get'。
Dictionary<string,string> example = new Dictionary<string,string>();
...
example.Add("hello","world");
...
Console.Writeline(example["hello"]);
测试/获取值的有效方法是TryGetValue
(感谢 Earwicker):
if (otherExample.TryGetValue("key", out value))
otherExample["key"] = value + 1;
使用此方法,您可以快速且无异常地获取值(如果存在)。
资源:
Dictionary-Keys
Try Get Value
【讨论】:
可能还想提一下 TryGetValue。O(lg(n))
和 Java 一样吗?我认为不是
@Desolator 读取为 O(1),请参阅 DictionaryDictionary 是等价的。虽然它没有 Get(...) 方法,但它有一个名为 Item 的索引属性,您可以在 C# 中使用索引表示法直接访问它:
class Test
Dictionary<int,String> entities;
public String getEntity(int code)
return this.entities[code];
如果您想使用自定义键类型,那么您应该考虑实现 IEquatable 并覆盖 Equals(object) 和 GetHashCode(),除非默认(引用或结构)相等性足以确定键的相等性。您还应该使您的密钥类型不可变,以防止在将密钥插入字典后发生突变时发生奇怪的事情(例如,因为突变导致其哈希码发生变化)。
【讨论】:
【参考方案3】:class Test
Dictionary<int, string> entities;
public string GetEntity(int code)
// java's get method returns null when the key has no mapping
// so we'll do the same
string val;
if (entities.TryGetValue(code, out val))
return val;
else
return null;
【讨论】:
这个答案非常陈旧,但无论TryGetValue
的结果如何,您都可以返回值,因为如果密钥没有,val
将被分配null
(即default(string)
)不存在。以上是关于C# 中的 Java Map 等效项的主要内容,如果未能解决你的问题,请参考以下文章