读取文本文件并添加到列表中
本文关键字:列表 添加 取文本 文件 读取 | 更新日期: 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.ID
、store.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);
}
}
我会使用LINQ
和Batch
方法来创建一批行,这样您就可以轻松地设置属性:
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创建一个新空间。目前,您正在同一位置重写数据。