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),请参阅 Dictionary 的 MSDN 页面的备注部分【参考方案2】:

Dictionary 是等价的。虽然它没有 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 等效项的主要内容,如果未能解决你的问题,请参考以下文章

Java 等效于 C# Linq 中的 Where 子句

C# 等效于 Java 中的 class.forName() [重复]

C# 中的 Jaxb 等效项

C# 中的 Jaxb 等效项

C# 等效于 Java 标点正则表达式

是否有与 Java 的 CountDownLatch 等效的 C#?