如何在 C# 中将列表中的所有项目打印到控制台?
How can I print all the items from the list to the console in C#?
我正在编写代码来获取输出(从文本文件中读取):“具有姓名、性别、年龄等实例的人员列表”。但是,当我 运行 代码时,我只得到了文本文件中列表的第一行。这是我的代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Person_Del
{
class Program
{
public static void Main(String[] args)
{
Console.SetIn(new StreamReader("data.txt"));
List<Person> p = new();
string data = Console.ReadLine();
Person obj = new();
obj.SetData(data,"/");
p.Add(obj);
foreach (var ii in p)
{
Console.WriteLine(ii.GetInfo());
}
}
}
public class Person
{
//static methods
public static void CheckData(string name, string gender, byte age)
{
string msg = null;
if (string.IsNullOrEmpty(name)) msg += "Empty Name";
if (string.IsNullOrEmpty(gender)) msg += (msg != null ? "; " : "") + "Empty Gender";
if (age > 125) msg += (msg != null ? "; " : "") + $"Invalid age ({age})";
if (msg != null) throw new Exception(msg);
}
public static (string, string, byte) Parse(string data, string delimiter)
{
try
{
string[] arr = data.Split(delimiter);
string name = arr[0].Trim();
string gender = arr[1].Trim();
byte age = byte.Parse(arr[2]);
return (name, gender, age);
}
catch (Exception)
{
throw new Exception($"Given data \"{data}\" are invalid.");
}
}
//instance fields
protected string name;
protected string gender;
protected byte age;
//instance methods
public string GetName() => name;
public string GetGender() => gender;
public byte GetAge() => age;
public void SetData(string name, string gender, byte age)
{
Person.CheckData(name, gender, age);
this.name = name;
this.gender = gender;
this.age = age;
}
public void SetData(string data, string delimiter)
{
(string, string, byte) value = Person.Parse(data, delimiter);
string name = value.Item1;
string gender = value.Item2;
byte age = value.Item3;
this.SetData(name, gender, age);
}
public string GetInfo() => $"Name:{name}, Gender:{gender}, Age:{age}";
//new instance methods for homework
public void SetName(string name) => this.name = name;
public void SetGender(string gender) => this.gender = gender;
internal bool SetData()
{
throw new NotImplementedException();
}
}
}
这是我的文本文件 (data.txt):
Alice/F/23
David/M/23
注意:我要获取上面两行的输出;然而,我得到的只是第一行“Alice/F/23”。
首先将所有行读入数组:
public static void Main(String[] args)
{
var lines = File.ReadAllLines("data.txt");
List<Person> people = new();
foreach(var line in lines){
Person p = new();
p.SetData(line,"/");
people.Add(obj);
}
foreach (var person in people )
{
Console.WriteLine(person.GetInfo());
}
}
通过使用 StreamReader 增量阅读:
public static void Main(String[] args)
{
using var sr = new StreamReader("data.txt");
List<Person> people = new();
while(!sr.EndOfStream)
{
var line = sr.ReadLine();
Person p = new();
p.SetData(line,"/");
people.Add(p);
}
foreach (var person in people)
{
Console.WriteLine(person.GetInfo());
}
}
你问的问题最终源于你只调用 ReadLine 一次,但我不建议将你的 StreamReader 存储在控制台的标准输入中。
我还把你的变量命名得更好一点;争取有意义的名称 - 对列表和数组等使用复数形式。短期变量可能相对没有意义,例如 Person p
但在多个地方使用的寿命更长的 ones/ones ,尝试制作它们以便代码读取喜欢一本书:foreach(var person in people)
而不是 foreach(var ii in p)
我正在编写代码来获取输出(从文本文件中读取):“具有姓名、性别、年龄等实例的人员列表”。但是,当我 运行 代码时,我只得到了文本文件中列表的第一行。这是我的代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace Person_Del
{
class Program
{
public static void Main(String[] args)
{
Console.SetIn(new StreamReader("data.txt"));
List<Person> p = new();
string data = Console.ReadLine();
Person obj = new();
obj.SetData(data,"/");
p.Add(obj);
foreach (var ii in p)
{
Console.WriteLine(ii.GetInfo());
}
}
}
public class Person
{
//static methods
public static void CheckData(string name, string gender, byte age)
{
string msg = null;
if (string.IsNullOrEmpty(name)) msg += "Empty Name";
if (string.IsNullOrEmpty(gender)) msg += (msg != null ? "; " : "") + "Empty Gender";
if (age > 125) msg += (msg != null ? "; " : "") + $"Invalid age ({age})";
if (msg != null) throw new Exception(msg);
}
public static (string, string, byte) Parse(string data, string delimiter)
{
try
{
string[] arr = data.Split(delimiter);
string name = arr[0].Trim();
string gender = arr[1].Trim();
byte age = byte.Parse(arr[2]);
return (name, gender, age);
}
catch (Exception)
{
throw new Exception($"Given data \"{data}\" are invalid.");
}
}
//instance fields
protected string name;
protected string gender;
protected byte age;
//instance methods
public string GetName() => name;
public string GetGender() => gender;
public byte GetAge() => age;
public void SetData(string name, string gender, byte age)
{
Person.CheckData(name, gender, age);
this.name = name;
this.gender = gender;
this.age = age;
}
public void SetData(string data, string delimiter)
{
(string, string, byte) value = Person.Parse(data, delimiter);
string name = value.Item1;
string gender = value.Item2;
byte age = value.Item3;
this.SetData(name, gender, age);
}
public string GetInfo() => $"Name:{name}, Gender:{gender}, Age:{age}";
//new instance methods for homework
public void SetName(string name) => this.name = name;
public void SetGender(string gender) => this.gender = gender;
internal bool SetData()
{
throw new NotImplementedException();
}
}
}
这是我的文本文件 (data.txt):
Alice/F/23
David/M/23
注意:我要获取上面两行的输出;然而,我得到的只是第一行“Alice/F/23”。
首先将所有行读入数组:
public static void Main(String[] args)
{
var lines = File.ReadAllLines("data.txt");
List<Person> people = new();
foreach(var line in lines){
Person p = new();
p.SetData(line,"/");
people.Add(obj);
}
foreach (var person in people )
{
Console.WriteLine(person.GetInfo());
}
}
通过使用 StreamReader 增量阅读:
public static void Main(String[] args)
{
using var sr = new StreamReader("data.txt");
List<Person> people = new();
while(!sr.EndOfStream)
{
var line = sr.ReadLine();
Person p = new();
p.SetData(line,"/");
people.Add(p);
}
foreach (var person in people)
{
Console.WriteLine(person.GetInfo());
}
}
你问的问题最终源于你只调用 ReadLine 一次,但我不建议将你的 StreamReader 存储在控制台的标准输入中。
我还把你的变量命名得更好一点;争取有意义的名称 - 对列表和数组等使用复数形式。短期变量可能相对没有意义,例如 Person p
但在多个地方使用的寿命更长的 ones/ones ,尝试制作它们以便代码读取喜欢一本书:foreach(var person in people)
而不是 foreach(var ii in p)