如何从文件中读取SortedList?

时间:2013-02-28 16:19:59

标签: c# collections .net

我有一个SortedList,键是Contact.name,值是一个对象,Contact。我正在将这个列表写入一个文件,使用BinaryWriter并且我没有任何问题,但现在我想阅读这个列表,之后,寻找一个特定的联系人。我不知道该怎么做。我认为我必须读取文件,然后查找联系人,但是如何用文件中保存的二进制代码填充SortedList?

2 个答案:

答案 0 :(得分:1)

听起来你想要BinaryReader,它会从BinaryWriter获取文件输出并反序列化为原始类型。

This is a good example of using both on msdn

答案 1 :(得分:1)

这是一个关于如何从二进制文件中读取和写入的快速示例。

static void Main(string[] args)
    {

        WriteContacts(new List<Contact>( new []{ new Contact { ID = 1, Name = "Juan", Age = 34 }, new Contact { Name = "Pedro", Age = 23, ID = 2 } }));
        FindContactInFile("Juan");
        FindContactInFile("Mario");
        Console.ReadKey();
    }

    private static void FindContactInFile(string name)
    {
        IFormatter formatter = new BinaryFormatter();

        using (Stream s = new FileStream("contacts.bin", FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            var contacts = (List<Contact>)formatter.Deserialize(s);
            var person  = contacts.Where(x=>x.Name==name).FirstOrDefault();
            if (person != null)
                Console.WriteLine("Persona encontrada: {0}", person.Name);
            else
                Console.WriteLine("{0} no fue encontrado en el archivo.", name);
        }
    }

    private static void WriteContacts(List<Contact> contacts)
    {
        IFormatter formatter = new BinaryFormatter();
        using (Stream s = new FileStream("contacts.bin", FileMode.Create, FileAccess.Write, FileShare.None))
        {
            formatter.Serialize(s, contacts);
        }
    }
}
[Serializable]
class Contact
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

在那里可以改进很多东西,比如每次搜索某人时都不会读取整个文件。或者不是一次性读取整个文件...在任何情况下,这里的关键概念是,为了将内容存储在二进制文件中,您需要序列化对象。为此,您可以使用.NET提供的BinaryFormatters之一(如上所述)并从文件中读回,您只需执行相反的操作。