使用迭代将所有项返回到IEnumerable

时间:2013-04-30 08:55:57

标签: c# file

我有一个固定记录长度为100的二进制文件,并希望使用以下代码读取文件中的所有记录:

    public IEnumerable<Book> GetAll()
    {
        Book book;
        using (Stream st = File.Open(HttpContext.Current.Server.MapPath("/") + "library.majid", FileMode.OpenOrCreate, FileAccess.Read))
        {
            long len = st.Length;
            using (BinaryReader reader = new BinaryReader(st))
            {
                for (int i = 0; i < len / 100; i++)
                {
                    st.Position = i * 100;
                    if (!reader.ReadBoolean())
                        yield return null;
                    book = new Book()
                    {
                        Id = reader.ReadInt32(),
                        Name = reader.ReadString(),
                        Dewey = reader.ReadString()
                    };
                    try
                    {
                        book.Subject = reader.ReadString();
                        book.RegDate = reader.ReadInt32();
                        book.PubDate = reader.ReadInt32();
                    }
                    catch (EndOfStreamException) { } 
                    yield return book;
                }

            }
        }

    }
 public static DataTable ListBooks(this IEnumerable<classes.Book> objs)
    { 

        DataTable table = new DataTable();
        table.Columns.Add("id",typeof(int));
        table.Columns.Add("name",typeof(String));
        table.Columns.Add("dewey", typeof(String));
        table.Columns.Add("subject", typeof(String));
        table.Columns.Add("reg");
        table.Columns.Add("pub");
        var values = new object[6];
        if (objs != null)
            foreach (classes.Book item in objs)
            {
                values[0] = item.Id;
                values[1] = item.Name;
                values[2] = item.Dewey;
                values[3] = item.Subject;
                values[4] = ((DateTime)IntToDateTime(item.RegDate)).ToLongDateString();
                if (item.PubDate != null)
                    values[5] = IntToDateTime(item.PubDate);
                else
                    values[5] = "";
                table.Rows.Add(values);
            }
        return table;
    }

当我想使用时使用ListBooks(GetAll())的结果我在foreach的第一行看到了这个错误:

  

对象引用未设置为对象的实例。

1 个答案:

答案 0 :(得分:3)

除了其他任何内容之外,您在代码中的各个位置yield return null。这意味着item将在您的循环中为空(假设您实际上调用getAll())。这反过来意味着提取item.Id会抛出异常。

我怀疑你的每一个yield return null;语句应为continue;yield break;。 (我也敦促你不要默默地吞下异常,并且总是使用大括号,即使对于单个语句if的主体。)