Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何像Java中使用哈希表一样使用C#通用字典?_C#_Dictionary - Fatal编程技术网

如何像Java中使用哈希表一样使用C#通用字典?

如何像Java中使用哈希表一样使用C#通用字典?,c#,dictionary,C#,Dictionary,我正在关注这一点,并且正在使用我发现与Java中的哈希表等效的字典 我是这样创建字典的: private Dictionary<String, Tile> tiles = new Dictionary<String, Tile>(); 我如何完成同样的事情。意思是得到x:y作为结果?获得值的最佳方法是 bool Dictionary<Key, Value>.TryGetValue(Key key, out Value value); 请参阅。简短回答 使

我正在关注这一点,并且正在使用我发现与Java中的哈希表等效的字典

我是这样创建字典的:

private Dictionary<String, Tile> tiles = new Dictionary<String, Tile>();

我如何完成同样的事情。意思是得到x:y作为结果?

获得值的最佳方法是

 bool Dictionary<Key, Value>.TryGetValue(Key key, out Value value);
请参阅。

简短回答 使用或方法。如果密钥不存在,则前者抛出一个,后者返回false

实际上,没有与Java
Hashtable
方法直接等价的方法。这是因为如果密钥不存在,Java的
get()
将返回null

返回指定键映射到的值,如果此映射不包含该键的映射,则返回null

另一方面,在C#中,我们可以将键映射到空值。如果索引器或
TryGetValue()
表示与键关联的值为null,则这并不意味着该键未映射。这只意味着密钥被映射为null

:
使用系统;
使用System.Collections.Generic;
公共课程
{
私有静态字典tiles=新字典();
公共静态void Main()
{
//在字典中添加两项
添加(“x”,新的Tile{Name=“y”});
添加(“x:null”,null);
//索引器访问
var value1=瓷砖[“x”];
Console.WriteLine(value1.Name);
//TryGetValue访问
瓷砖价值2;
tiles.TryGetValue(“x”,输出值2);
Console.WriteLine(value2.Name);
//索引器对空值的访问
var value3=分幅[“x:null”];
Console.WriteLine(value3==null);
//使用空值访问TryGetValue
瓷砖价值4;
tiles.TryGetValue(“x:null”,out value4);
Console.WriteLine(value4==null);
//密钥不存在时的索引器访问
尝试
{
var n1=瓷砖[“不”];
}
catch(keynotfounde异常)
{
控制台写入线(e.Message);
}
//使用不存在的键访问TryGetValue
瓷砖n2;
var结果=tiles.TryGetValue(“nope”,输出n2);
控制台写入线(结果);
Console.WriteLine(n2==null);
}
公共级瓷砖
{
公共字符串名称{get;set;}
}
}

HashMap#get
在键查找失败时返回null,而
Dictionary#[]
抛出异常。另外,“key”值(
x+”:“+y
)在两种语言中都是一样创建的。@user2864740如果get返回null,如何知道null值是与传递的键相关联地存储的,还是传递的键不在哈希表中?如果使用索引器且null返回,然后您就知道null已与密钥关联存储。这是因为如果没有密钥,就会出现异常。另一方面,如果使用
TryGetValue
,如果该键不存在,它将返回false。这就是你应该知道的。@Jeroenvanevel和其他收信人:Shaun在中发布了关于此收信的帖子。@phoog
HashMap#containsKey
可以首先使用和/或结合使用。这只是Java中的一种东西。。现在对我来说,对
null
:-D(Java8引入了
#getOrDefault
,这将允许使用非null的哨兵值作为替代方法。)@Jeroenvanevel这似乎是一个主题,很难发现我们是否没有阅读MSDN文档的经验。您提供的链接很有帮助,但它没有回答用户的问题,用户的问题是在C#中寻找一个与Java中存在的等价物。说它微不足道既不公平也不现实,而且不必要地令人沮丧。我们需要程序员,说RTFM没有帮助。@Jeroenvanevel和其他收信人:Shaun在中发布了关于这个收信的帖子。你应该更加小心你的问题标题:“作为Java中的哈希表”,听起来你想实际使用Java中的C#dictionary,这当然是一个愚蠢的问题。想想看问题列表的人。他们会看到你的问题标题,并认为“这太愚蠢了,我最好去投票并关闭它”。你可能想解释你想要它的方式,而不是指向另一种语言+标准库。谢谢肖恩·卢廷,对不起所有不喜欢这个问题的人,我希望它在某个时候能帮助像我这样的人。
 bool Dictionary<Key, Value>.TryGetValue(Key key, out Value value);
private Dictionary<String, Tile> tiles = new Dictionary<String, Tile>();
Tile outValue;
if(tiles.TryGetValue( x + ":" + y, out outValue))
{
     Console.WriteLine("I have this: " + outValue.ToString());
}
else
{
     Console.WriteLine("I have nothing");
}
using System;
using System.Collections.Generic;

public class Program
{
    private static Dictionary<String, Tile> tiles = new Dictionary<String, Tile>();
    public static void Main()
    {
        // add two items to the dictionary
        tiles.Add("x", new Tile { Name = "y" });
        tiles.Add("x:null", null);

        // indexer access
        var value1 = tiles["x"];
        Console.WriteLine(value1.Name);

        // TryGetValue access
        Tile value2;
        tiles.TryGetValue("x", out value2);
        Console.WriteLine(value2.Name);

        // indexer access of a null value
        var value3 = tiles["x:null"];
        Console.WriteLine(value3 == null);

        // TryGetValue access with a null value
        Tile value4;
        tiles.TryGetValue("x:null", out value4);
        Console.WriteLine(value4 == null);

        // indexer access with the key not present
        try
        {
            var n1 = tiles["nope"];     
        }
        catch(KeyNotFoundException e)
        {
            Console.WriteLine(e.Message);
        }

        // TryGetValue access with the key not present      
        Tile n2;
        var result = tiles.TryGetValue("nope", out n2);
        Console.WriteLine(result);
        Console.WriteLine(n2 == null);
    }

    public class Tile
    {
        public string Name { get; set; }
    }
}