C#中的Java Map等效项


150

我正在尝试使用选择的键来保存集合中的项目列表。在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)方法

Answers:


181

您可以索引Dictionary,不需要“ 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;
}

使用此方法,您可以快速且无异常地获取值(如果存在)。

资源:

字典键

尝试获得价值


14
可能还要提及TryGetValue。
丹尼尔·艾威克

是不是O(lg(n))像Java吗?我认为不是

1
@Desolator的读取值为O(1),请参见Dictionary <TKey,TValue>的MSDN页面的“备注”部分
canton7'9

17

字典<,>是等效的。虽然它没有Get(...)方法,但确实有一个称为Item的索引属性,您可以使用索引符号直接在C#中访问它:

class Test {
  Dictionary<int,String> entities;

  public String getEntity(int code) {
    return this.entities[code];
  }
}

如果要使用自定义键类型,则应考虑实现IEquatable <>并覆盖Equals(object)和GetHashCode(),除非默认(引用或结构)相等性足以确定键的相等性。您还应该使密钥类型不可变,以防止在将密钥插入字典后发生突变时发生奇怪的事情(例如,由于该突变导致其哈希码发生更改)。


10
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;
    }
}

5
这个答案太荒谬了,但是无论键的结果如何,您都可以返回值TryGetValue,因为如果键不存在,val则将分配该值null(即default(string))。
dlev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.