C# 从文件读取数据和存储的最佳方法?

C# 从文件读取数据和存储的最佳方法?,c#,filereader,streamreader,C#,Filereader,Streamreader,我有一个文本文件,它以这种方式存储数据: Player name: NAME HERE Speed: 7 Strength: 9 Stamina: 4 Player name: ANOTHER NAME HERE Speed: 5 Strength: 8 Stamina: 3 玩家名称:这里的名字 速度:7 人数:9人 耐力:4 玩家名称:这里有另一个名字 速度:5 人数:8人 耐力:3 同一个文件包含大约15名不同的球员,我想从他们每个人那里收集值,存储在一个临时比赛变量中,然后计算速度、力量

我有一个文本文件,它以这种方式存储数据:

Player name: NAME HERE Speed: 7 Strength: 9 Stamina: 4 Player name: ANOTHER NAME HERE Speed: 5 Strength: 8 Stamina: 3 玩家名称:这里的名字 速度:7 人数:9人 耐力:4 玩家名称:这里有另一个名字 速度:5 人数:8人 耐力:3 同一个文件包含大约15名不同的球员,我想从他们每个人那里收集值,存储在一个临时比赛变量中,然后计算速度、力量和耐力的平均值,并给出一名获胜者。我的第一个想法是使用正则表达式,但我目前正在调查是否有其他更可持续的方法来实现这一点


这是我的一个附带项目,欢迎任何帮助。谢谢

如果文件格式是固定的,一种方法是使用
System.IO.file.ReadAllLines
获取文件中的每一行,然后循环行,拆分键(在
的左侧)和值(在
的右侧)。用处理每行时从文件中读取的值填充某种类型的数据对象(
PlayerObject

PlayerObject player = new PlayerObject();
string[] allLines = System.IO.File.ReadAllLines(FILE_PATH_HERE);
foreach(string dataPair in allLines)
{
    string[] pair = dataPair.Split(new[] { ':' });
    if(pair.Length == 2)
    {
        switch(pair[0])
        {
            case "Player name": /*process pair[1]*/ break;
            case "Speed": /*process pair[1]*/ break;
            //other possible key strings here
            //recommend defining these as constants
        }
    }
}
这将允许您对文件中的参数进行重新排序(或至少支持不同的排序),如果缺少任何参数,可以在数据对象中将其预设为某个默认值


格式中唯一缺少的是记录之间的某种哨兵值。现在,您可以假设每个玩家都由一个新的“玩家名称”条目描述,并在读取下一个“玩家名称”后开始填充下一个
PlayerObject

定义您的种族类别结构:

public class Race
{
    public string Name;
    public int Speed;
    public int Strength;
    public int Stamina;
}
从文本文件中读取数据,实例化
Race
对象并将其收集到
列表中。收集后,您可以从
列表中调用
Average()
,以获取结果

string[] myTextFileLines = File.ReadAllLines(myTextFile);

List<Race> myRaces = new List<Race>();
for (int i = 0; i < myTextFileLines.Length; i += 4)
{
    myRaces.Add(new Race()
                    {
                        Name = myTextFileLines[i].Substring(myTextFileLines[i].IndexOf(":") + 2),
                        Speed = Convert.ToInt32(myTextFileLines[i + 1].Substring(myTextFileLines[i + 1].IndexOf(":") + 2)),
                        Strength = Convert.ToInt32(myTextFileLines[i + 2].Substring(myTextFileLines[i + 2].IndexOf(":") + 2)),
                        Stamina = Convert.ToInt32(myTextFileLines[i + 3].Substring(myTextFileLines[i + 3].IndexOf(":") + 2)),
                    });
}

Console.WriteLine("Avg Speed: {0}", myRaces.Average(r => Convert.ToDouble(r.Speed)));
Console.WriteLine("Avg Strength: {0}", myRaces.Average(r => Convert.ToDouble(r.Strength)));
Console.WriteLine("Avg Stamina: {0}", myRaces.Average(r => Convert.ToDouble(r.Strength)));
Console.ReadLine();
string[]myTextFileLines=File.ReadAllLines(myTextFile);
List myRaces=新列表();
对于(int i=0;iConvert.ToDouble(r.Speed));
WriteLine(“平均强度:{0}”,myRaces.Average(r=>Convert.ToDouble(r.Strength));
WriteLine(“平均耐力:{0}”,myRaces.Average(r=>Convert.ToDouble(r.Strength));
Console.ReadLine();
结果(使用您在问题中提供的确切数据):


XML解决方案的一个示例:

Players.xml

<?xml version="1.0" encoding="utf-8" ?>
<players>
  <player name="Alice">
    <speed>7</speed>
    <strength>9</strength>
    <stamina>4</stamina>
  </player>
  <player name="Bob">
    <speed>5</speed>
    <strength>8</strength>
    <stamina>3</stamina>
  </player>
</players>
输出

Name: Alice
Speed: 7
Strength: 9
Stamina: 4

Name: Bob
Speed: 5
Strength: 8
Stamina: 3

Name: Alice
Speed: 7
Strength: 10
Stamina: 4

Name: Bob
Speed: 5
Strength: 8
Stamina: 3

不清楚您的文件是否包含每个玩家的所有可能属性。例如,上面的摘要缺少
Player name
对于第二条记录,有人编辑了我的线程,有两个Player name。我会解决这个问题,如果你控制文件布局,我建议你使用XML。C#拥有非常方便和强大的XML处理工具。如果不是,让我们知道所有项目是否总是为所有玩家提供,并且它们的顺序是否总是相同的?我对XML一点都不熟悉,也许我应该做一些研究。回答你的问题:是的,它们总是以相同的顺序/公式出现。实现这一点的“现代”方法可能是从JSON序列化到JSON。如果您使用JSON库,则无需直接解析。感谢您的贡献。对XML文件的写入是什么样子的?也许爱丽丝会变得更强壮(比如说10)
Name: Alice
Speed: 7
Strength: 9
Stamina: 4

Name: Bob
Speed: 5
Strength: 8
Stamina: 3

Name: Alice
Speed: 7
Strength: 10
Stamina: 4

Name: Bob
Speed: 5
Strength: 8
Stamina: 3