将二进制读取到列表

本文关键字:列表 二进制 读取 | 更新日期: 2023-09-27 17:56:13

我正在尝试创建一个保存到文件中的引号列表。一旦引号显示在控制台上,我会将布尔值更改为 true。索引用于处理要在控制台上显示的报价。首先,我尝试了File.WriteAllLines,但这不适用于我的Quotes类。

似乎我将列表序列化为文件的尝试可以正常工作,但是我不知道如何在应该从文件读取到myList2的代码中摆脱CS1061。

我真的很想得到一些反馈。代码只是为了我自己的学习和娱乐。

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace Quotes
{
    // A quote followed by a bool to show if it has been showed recently and an index to navigate the list.
    [Serializable]
    class Quotes
    {
        private string quote;
        private bool shown;
        private int index;
        public Quotes(string _quote, bool _shown, int _index)
        {
            quote = _quote;
            shown = _shown;
            index = _index;
        }
        public string Quote
        {
            get
            {
                return quote;
            }
            set
            {
                quote = value;
            }
        }
        public bool Shown
        {
            get
            {
                return shown;
            }
            set
            {
                shown = value;
            }
        }
        public int Index
        {
            get
            {
                return index;
            }
            set
            {
                index = value;
            }
        }
        public override string ToString()
        {
            return string.Format("{0} {1} {2}", quote, shown, index);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // Set a variable to the My Documents path.
            string mydocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            //List<Quotes> myList = new List<Quotes>();
            var myList = new List<Quotes>();
            myList.Add(new Quotes("One", false, 1));
            myList.Add(new Quotes("Two", false, 2));
            myList.Add(new Quotes("Three", false, 3));
            myList.Add(new Quotes("Four", false, 4));
            //Write the list to a file. Expand to accept user input and add at the end of the file.
            try
            {
                using (Stream stream = File.Open(mydocpath + @"'WriteLines.txt", FileMode.Create))
                {
                    BinaryFormatter bin = new BinaryFormatter();
                    bin.Serialize(stream, myList);
                }
            }
            catch (IOException)
            {
            }
            //Read from a file and write to the list.Put in a method when it works.
            try
            {
                using (Stream stream = File.Open(mydocpath + @"'WriteLines.txt", FileMode.Open))
                {
                    BinaryFormatter bin = new BinaryFormatter();
                    var myList2 = (List<Quotes>)bin.Deserialize(stream);
                    foreach (var quote in myList2)
                    {
                        //Why is this not working? Where should I define quote??
                        Console.WriteLine("{0}, {1}, {2}", myList2.quote, myList2.shown, myList2.index);
                    }
                }
            }
            catch (IOException)
            {
            }
        }
    }
}

将二进制读取到列表<T>

目前您的代码尝试访问 myList2.quote ,但即使在 foreach 块中,myList2仍然是列表本身,而不是"该列表中的当前项"。

foreach将列表中的每个单独的Quote对象分配给var quote变量。在foreach块中,您可以使用以下命令访问该报价的属性:

Console.WriteLine("{0}, {1}, {2}", quote.Quote, quote.Shown, quote.Index);

(请注意,quote.quote是私有字段,而quote.Quote是您可以访问的公共属性)

foreach 循环在每次运行时都会在名为 quote 的变量中创建列表中每个报价的实例

foreach (var quote in myList2) 

因此,您应该在循环中的代码中引用该变量。

{
    Console.WriteLine("{0}, {1}, {2}", quote.Quote, quote.Shown, quote.Index);
}

谢谢一堆。我设法让自己感到困惑。现在很明显我犯了错误。

同样明显的是,我需要研究在这个网站上发布的位置和方式。谢谢你对我这样的菜鸟温柔。