我正在撰寫一個代碼來獲取輸出(從文本檔案中讀取):“具有姓名、性別、年齡等實體的人員串列”。但是,當我運行代碼時,我只得到了文本檔案中串列的第一行。這是我的代碼:
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”。
uj5u.com熱心網友回復:
通過首先將所有行讀入陣列:
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在多個地方使用但壽命較長的變數/變數,嘗試制作它們,使代碼讀起來像一本書:foreach(var person in people)而不是foreach(var ii in p)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/413384.html
標籤:
下一篇:如何水平排列導航欄中的串列?
