C# 如何将文本文件中的行存储到列表中?
我正在Visual Studio中编写一个C#程序,它将读取文本文件并将行添加到列表中。 文本文件包含了人们的姓名和年龄C# 如何将文本文件中的行存储到列表中?,c#,visual-studio,C#,Visual Studio,我正在Visual Studio中编写一个C#程序,它将读取文本文件并将行添加到列表中。 文本文件包含了人们的姓名和年龄 Name: Amy Age: 30 Name: Bob Age: 25 .... 文本文件作为参数发送到列表函数 在List函数中,我想从文本文件中读取每一行并将其添加到列表中(info1) 我已经写了一个代码。但是当我运行代码时会出现构建错误 行中有一个错误 info1.Add(line.ToString()); 代码如下: using Sy
Name: Amy
Age: 30
Name: Bob
Age: 25
....
文本文件作为参数发送到列表函数
在List函数中,我想从文本文件中读取每一行并将其添加到列表中(info1)
我已经写了一个代码。但是当我运行代码时会出现构建错误
行中有一个错误
info1.Add(line.ToString());
代码如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
class Class1
{
public void Main()
{
List<Info> info1 = Load(@"filename.txt");
Console.ReadKey();
}
}
public List<Info> Load(string file)
{
List<Info> info1 = new List<Info>();
using (StreamReader rdr = new StreamReader(file))
{
string line;
while ((line = rdr.ReadLine()) != null)
{
info1.Add(line.ToString());
}
}
return info1;
}
public class Info
{
public string Name { get; set; }
public string Age { get; set; }
public Info(string name, string age)
{
Name = name;
Age = age;
}
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间控制台应用程序
{
一班
{
公共图书馆
{
List info1=Load(@“filename.txt”);
Console.ReadKey();
}
}
公共列表加载(字符串文件)
{
List info1=新列表();
使用(StreamReader rdr=新StreamReader(文件))
{
弦线;
而((line=rdr.ReadLine())!=null)
{
info1.Add(line.ToString());
}
}
返回信息1;
}
公共类信息
{
公共字符串名称{get;set;}
公共字符串年龄{get;set;}
公共信息(字符串名称、字符串期限)
{
名称=名称;
年龄=年龄;
}
}
}
我不确定我犯了什么错误。我的代码中有错误吗
编辑:我不知道如何更正代码以确保我可以添加到列表中。如何更正代码?.ToString()
string
,但您正试图将其添加到信息列表中。这就是你的代码不能编译的原因
您需要阅读两行内容(第一行是姓名信息,第二行是年龄信息),info
实例和。您试图添加到列表中的字符串对象。
由于这是一种类型冲突,编译器可能会给您一个强制转换错误列表的类型为Info
,但代码试图添加字符串
,这会导致异常
这将解决您的问题,解决方案使用Linq
public List<Info> Load(string file)
{
List<Info> info1 = new List<Info>();
var contents = File.ReadLines(file)
.Select(x=> new {item=x, index=i})
.GroupBy(x=> x.index/2)
.Select(x=> new Info()
{
Name = x.First().item.Split(':')[1], // Name
Age = x.Last().item.Split(':')[1] // Age
}
.ToList();
info1.AddRange(content);
return info1;
}
公共列表加载(字符串文件)
{
List info1=新列表();
var contents=File.ReadLines(文件)
.Select(x=>new{item=x,index=i})
.GroupBy(x=>x.index/2)
.选择(x=>newinfo()
{
Name=x.First().item.Split(“:”)[1],//Name
Age=x.Last().item.Split(“:”)[1]//年龄
}
.ToList();
info1.AddRange(content);
返回信息1;
}
列表信息1=新列表();
info1
是一个列表
,但您可以向列表中添加一个字符串
:
info1.Add(line.ToString());
您应该创建一个新的Info
对象,并将其添加到info1
string[]lines=File.ReadAllLines(@“filename.txt”);
string[] lines = File.ReadAllLines(@"filename.txt");
List<Info> infos = new List<Info>();
foreach(var line in lines)
{
string name = "";
string age = "";
if(line.StartsWith("Name:"))
{
name = line.Replace("Name: ", "");
}
else if(line.StartsWith("Age:"))
{
age = line.Replace("Age: ", "");
}
Info info = new Info(name, age);
infos.Add(info);
}
列表信息=新列表();
foreach(行中的var行)
{
字符串名称=”;
字符串年龄=”;
if(第行StartsWith(“名称:”)
{
名称=行。替换(“名称:”,“”);
}
else if(第行StartsWith(“年龄:”)
{
年龄=行。替换(“年龄:,”);
}
信息信息=新信息(姓名、年龄);
添加(信息);
}
这是如何从每两行中创建一个Info
对象:
public static List<Info> Load(string file)
{
List<Info> results = new List<Info>();
string name = null;
foreach (var line in File.ReadAllLines(file))
{
bool isName = false;
string age = null;
if (line.Contains("Name:"))
{
name = null;
isName = true;
}
string value = line.Split(':')[1];
if (isName)
name = value;
else
age = value;
if (!isName)
{
results.Add(new Info(name, age));
name = null;
}
}
return results;
}
公共静态列表加载(字符串文件)
{
列表结果=新列表();
字符串名称=null;
foreach(文件中的var行。ReadAllLines(文件))
{
bool-isName=false;
字符串年龄=空;
如果(第行包含(“名称:”))
{
name=null;
isName=true;
}
字符串值=line.Split(“:”)[1];
if(isName)
名称=值;
其他的
年龄=价值;
如果(!isName)
{
结果.添加(新信息(姓名、年龄));
name=null;
}
}
返回结果;
}
您需要创建Info类的新实例来添加Info列表,因为您的列表类型是“Info”,并且您正在尝试添加“字符串”
您尝试在需要类型info1的位置添加类型字符串,因为info1
是列表info1
您无法通过info1.add添加string
;添加(line.ToString();
感谢您的回复:)我认为它将添加一行没有设置年龄的姓名和一行没有设置姓名的年龄。如果您将信息创建和添加放在else块中,那么它将起作用。
public static List<Info> Load(string file)
{
List<Info> results = new List<Info>();
string name = null;
foreach (var line in File.ReadAllLines(file))
{
bool isName = false;
string age = null;
if (line.Contains("Name:"))
{
name = null;
isName = true;
}
string value = line.Split(':')[1];
if (isName)
name = value;
else
age = value;
if (!isName)
{
results.Add(new Info(name, age));
name = null;
}
}
return results;
}
using (StreamReader rdr = new StreamReader(file))
{
string line;// for Name
string line2;//for Age
while ((line = rdr.ReadLine()) != null)
{
line2= rdr.ReadLine();
info1.Add(new Info(line,line2));
}
}
return info1;
}