相当于C#Java HashMap


325

从Java世界进入C#,是否有等效的HashMap?如果没有,您会推荐什么?

Answers:


481

Dictionary可能是最接近的。System.Collections.Generic.Dictionary实现该System.Collections.Generic.IDictionary接口(类似于Java的Map接口)。

您应该注意一些明显的区别:

  • 添加/获取项目
    • Java的HashMap具有用于设置/获取项目的putget方法
      • 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将用新值替换现有值。
    • Dictionary如果使用[]索引,.NET 将用新值替换现有值。如果使用该Add方法,它将抛出一个ArgumentException
  • 尝试获取不存在的密钥
    • Java HashMap将返回null。
    • .NET Dictionary会抛出一个KeyNotFoundException。您可以使用该TryGetValue方法而不是[]索引来避免这种情况:
      MyObject value = null; if (!myDictionary.TryGetValue(key, out value)) { /* key doesn't exist */ }

DictionaryContainsKey方法可以帮助解决前面的两个问题。


9
没有完全等效(在JAVA允许HashMap的空值和空键)download.oracle.com/javase/1.4.2/docs/api/java/util/...
法比奥Maulo

3
是的,Dictionary接近但不准确。
Powerlord 2010年

14
注意,Dictionary添加重复的键时会引发异常。
Rubens Mariuzzo 2011年

4
此外,当请求不存在的键的值时,将引发异常。
鲁本斯·马里努佐

if (!myDictionary.TryGetValue(key, value))out第二个参数需要一个。所以if (!myDictionary.TryGetValue(key, out value))
bugybunny

38

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>

6
您不能通过将对象作为类型参数来继续泛型主题吗?
colithium 2012年

这行不通。public StringDictionary this [string key] {...应该是public String this [string key] {。同样,我尝试使用base [key]也不起作用。我建议实现IDictionary并仅具有一个全局私有字典对象并为每种方法处理null情况。
A.sharif 2015年

4
我想知道您为什么不拼错字典。
吉姆·巴尔特

5
@JimBalter显然他需要一本字典。
菲利普·埃尔姆

17

让我以“ codaddict算法”为例来帮助您理解它

字典在C#”是“ 的Hashmap平行宇宙中的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);

    }
}

C#中的Codaddict算法

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();
    }
}

5

请查阅MSDN上有关Hashtable类的文档。

表示根据键的哈希码组织的键和值对的集合。

另外,请记住,这不是线程安全的。


22
Dictionary<TKey, TValue>最好是因为编译时类型检查并且不需要装箱值类型。
Thorarin

3

使用字典-使用哈希表,但类型安全。

另外,您的Java代码

int a = map.get(key);
//continue with your logic

最好用C#这样编码:

int a;
if(dict.TryGetValue(key, out a)){
//continue with your logic
}

这样,您可以在一个块内确定变量“ a”的需求,如果以后需要,仍可以在该块外访问它。


0

答案是

字典

看一下我的函数,它的简单添加使用了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
    }

0

我只想给我两美分。
这是根据@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");
}
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.