读取文本文件并添加到列表中

本文关键字:列表 添加 取文本 文件 读取 | 更新日期: 2023-09-27 18:22:49

我有一个这样的文本文件。我想逐行读取并将这些信息存储到List<Store>中,其中Store是自定义类型。

Store ID: 01
Name: Kingfisher
Branch Number: 1
Address: 23 Emerson St
Phone: 422361609
-----END OF RECORD-----
Store ID: 02
Name: Harvey
Branch Number: 2
Address: 23 Korby St
Phone: 422361609
-----END OF RECORD-----
Store ID: 175
Name: Roger
Branch Number: 4
Address: 275 Carmody Rd
Phone: 428395719
-----END OF RECORD-----

这是我正在使用的。因为记录总是按照列表中显示的顺序,所以我逐行读取并分配store.IDstore.name,。。。直到它到达记录的最后一个属性是store.phoneNumber,然后它将把它添加到列表中,并在下一个Store ID时继续进行foreach循环。

但问题是,当我在列表中搜索时,它只能返回最终记录。列表似乎只有一个元素,那就是最终记录。有人能指出我错在哪里吗?

    var storeTemp = new Store();
    List<Store> stores = new List<Store>();
    foreach (string line in File.ReadAllLines(@"C:'Store.txt"))
    {
        if (line.Contains("Store ID: "))
            storeTemp.ID = line.Substring(10);
        if (line.Contains("Name: "))
            storeTemp.name = line.Substring(6);
        if (line.Contains("Branch Number: "))
            storeTemp.branchNO = Convert.ToInt32(line.Substring(15));
        if (line.Contains("Address: "))
            storeTemp.address = line.Substring(9);
        if (line.Contains("Phone: "))
        {
            storeTemp.phoneNumber = Convert.ToInt32(line.Substring(7));
            stores.Add(storeTemp);
        }
    }

读取文本文件并添加到列表中

我会使用LINQBatch方法来创建一批行,这样您就可以轻松地设置属性:

File.ReadLines("path")
.Batch(5)
.Select(x => x.ToList())
.Select(values => new Store 
                  {
                     ID = values[0].Split(':').Trim(),
                     name = values[1].Split(':').Trim(),
                     branchNo = int.Parse(values[2].Split(':').Trim()),
                     address = values[3].Split(':').Trim(),
                     phoneNumber =int.Parse(values[4].Split(':').Trim())
                  }.ToList();

为了使用Batch方法,您需要添加对MoreLINQ库的引用。

        List<Store> stores = new List<Store>();
            var storeTemp = new Store();
        foreach (string line in File.ReadAllLines(@"C:'Store.txt"))
        {
            // You needto create a new instance each time
            if (line.Contains("Store ID: "))
                storeTemp.ID = line.Substring(10);
            if (line.Contains("Name: "))
                storeTemp.name = line.Substring(6);
            if (line.Contains("Branch Number: "))
                storeTemp.branchNO = Convert.ToInt32(line.Substring(15));
            if (line.Contains("Address: "))
                storeTemp.address = line.Substring(9);
            if (line.Contains("Phone: "))
            {
                storeTemp.phoneNumber = Convert.ToInt32(line.Substring(7));
                stores.Add(storeTemp);
                storeTemp = new Store(); // You need to recreate the object, otherwise you overwrite same instance
            }
        }

只需将存储类型从Class更改为Struct

您每次都会在内存中为storeTemp创建一个新空间。目前,您正在同一位置重写数据。