C#中的字典 - 键/值的永久性

时间:2015-10-31 14:30:39

标签: c#

我可以在代码中永久保存C#代码中的键/项吗?:

class Program
{
    public class Variable
    {
        public object Value { get; set; }
    }
    static void Main(string[] args)
    {
        Console.WriteLine("Hi, please log in...");
        Console.WriteLine("Enter your username: ");
        string y = Console.ReadLine();
        Console.WriteLine("Enter your passcode: ");
        string n = Console.ReadLine();
        Dictionary<String, String> usersDict = new Dictionary<String, String>();
        bool exists = usersDict.ContainsKey("n") ? usersDict["n"] == "y" : false;
        if (exists == true)
        { 
            Console.WriteLine("Hello; "+y);
            Console.ReadLine();
        }
        else
        {
            usersDict.Add(n, y);


            Console.WriteLine("You have been added: " + y);
            Console.ReadLine();
        }
    }
}

所以有人可以创建一个帐户,然后另一天登录? 非常感谢!

3 个答案:

答案 0 :(得分:0)

您问题的简短回答不是您目前的设置方式。

此时,一旦程序完成main函数,主要的堆栈帧将被释放,导致所有内存被释放。这适用于您运行的所有程序。

要解决此问题,您需要设置一个非易失性文件或存储系统(文本文件,XML文档,数据库等),以保持您希望保留在程序之外的数据。

为了简单起见,我建议您坚持使用文本文件,直到您可以了解有关IO的更多内容。

这些链接应该为您提供一个起点:

MSDN: How to: Write to a Text File

MSDN: How to: Read from a Text File

答案 1 :(得分:0)

DataTable可以替代Dictionary,因为DataTable具有方便的ReadXML和WriteXML方法,允许您将数据写入XML格式的文件。

这是一种将Dictionary加载到DataTable并将其写入文件的方法:

void WriteDictionaryToFile(Dictionary<string, string> dict, string filename)
    {
        using (DataTable dt = new DataTable("Dict"))
        {
            dt.Columns.Add("Key", typeof(string));
            dt.Columns.Add("Value", typeof(string));

            foreach (var kvp in dict)
            {
                dt.Rows.Add(kvp.Key, kvp.Value);
            }
            dt.WriteXml(filename);
        }

    }

从文件中读取字典的方法:

void ReadDictionaryFromFile(Dictionary<string, string> dict, string filename)
{
    DataTable dt = new DataTable("Dict");
    dt.Columns.Add("Key", typeof(string));
    dt.Columns.Add("Value", typeof(string));

    dt.ReadXml(filename);
    foreach (DataRow row in dt.Rows)
    {
        dict[row[0].ToString()] = row[1].ToString();
    }
}

这些方法肯定需要添加一些异常处理。

您还可以使用类型参数代替“string”来使方法通用。例如:

void ReadDictionaryFromFile<T,U>(Dictionary<T, U> dict, string filename)
{
    DataTable dt = new DataTable("Dict");
    dt.Columns.Add("Key", typeof(T));
    dt.Columns.Add("Value", typeof(U));

    dt.ReadXml(filename);
    foreach (DataRow row in dt.Rows)
    {
        dict[(T)row[0]] = (U)row[1];
    }
}

答案 2 :(得分:0)

如果你想要的只是存储字典并在需要时将其恢复,那么你可以使用JSON Serialize / Deserialize来实现。我使用下面的Newtonsoft JSON(也可通过Nuget)库进行序列化/反序列化。

Dictionary<string, string> myDictionary = new Dictionary<string, string> { { "1", "A" }, { "2", "B" } };

//Serialize Dictionary to string and store in file
string json = Newtonsoft.Json.JsonConvert.SerializeObject(myDictionary);
System.IO.File.WriteAllText(@"C:\Docs\json.txt", json);

//Read serialized dictionary json string and Deserialize to Dictionary object
string jsonString = System.IO.File.ReadAllText(@"C:\Docs\json.txt");
Dictionary<string, string> deserializedDictionary = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonString);

希望这能帮到你......