如何使用哈希表C#

时间:2017-01-16 07:27:49

标签: c# dictionary hashtable hashset

我有两个问题:

  1. Hashtable和Dictionary之间有什么区别?

  2. 有没有办法将这些集合中的任何一个保存到磁盘?

1 个答案:

答案 0 :(得分:2)

首先,不要使用Hashtable。请改用HashSet。您可以在命名空间System.Collections.Generic中找到它。

  

什么是哈希地图?

哈希映射(或字典,因为它在C#中调用)是一种数据结构,允许您使用其他类型的输入查找一种类型的数据。基本上,当您向字典添加项目时,您同时指定。然后,当你想在字典中查找值时,只需给它一个键,它就会给你一个与之关联的值。

例如,如果您希望能够通过UPC查找一堆Product对象,则可以将产品添加到Dictionary中,并将Product作为值,将UPC编号作为键。

另一方面,

HashSet 不存储键和值对。它只是存储物品。哈希集(或任何集合)确保在向集合中添加项目时,不会出现重复项。

  

当我在哈希表中添加项目时,我可以将其保存为新文件并还原原始项目吗?

首先,不要使用Hashtable。请改用HashSet。您可以在命名空间System.Collections.Generic中找到它。要使用它,您只需像对其他任何集合一样添加项目。

与其他集合一样,HashSet支持序列化序列化是指您获取对象并将其转换为字节字符串,因此它可以是保存到文件或通过互联网发送)。这是一个显示哈希集序列化的示例程序:

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace HashSetSerializationTest
{
class Program
{
    static void Main(string[] args)
    {
        var set = new HashSet<int>();
        set.Add(5);
        set.Add(12);
        set.Add(-50006);

        Console.WriteLine("Enter the file-path:");
        string path = Console.ReadLine();
        Serialize(path, set);
        HashSet<int> deserializedSet = (HashSet<int>)Deserialize(path);

        foreach (int number in deserializedSet)
        {
            Console.WriteLine($"{number} is in original set: {set.Contains(number)}");
        }
        Console.ReadLine();
    }

    static void Serialize(string path, object theObjectToSave)
    {
        using (Stream stream = File.Create(path))
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, theObjectToSave);
        }
    }

    static object Deserialize(string path)
    {
        using (Stream stream = File.OpenRead(path))
        {
            var formatter = new BinaryFormatter();
            return formatter.Deserialize(stream);
        }
    }
}
}

为了序列化任何内容,您需要包含System.IOSystem.Runtime.Serialization.Formatters.Binary