Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我能';无法从FileText C中读取#_C#_Oop_Generic List - Fatal编程技术网

C# 我能';无法从FileText C中读取#

C# 我能';无法从FileText C中读取#,c#,oop,generic-list,C#,Oop,Generic List,我必须在学生、班级和年份之间建立这样的联系:一年可以有一个或多个班级,一个班级可以有一个或多个学生 我用一个通用列表做了这个。问题是我必须从一个.txt文件中获取信息,但我不知道怎么做 我的文件是这样的: (Year,Class,Name,Surname,Average). 1 314 George Andrew 8 2 324 Popescu Andrei 9 2 323 Andreescu Bogdan 10 3 332 Marin D

我必须在学生、班级和年份之间建立这样的联系:一年可以有一个或多个班级,一个班级可以有一个或多个学生

我用一个通用列表做了这个。问题是我必须从一个
.txt
文件中获取信息,但我不知道怎么做

我的文件是这样的:

(Year,Class,Name,Surname,Average).
1   314 George      Andrew  8
2   324 Popescu     Andrei  9
2   323 Andreescu   Bogdan  10
3   332 Marin       Darius  9
3   332 Constantin  Roxana  10
代码:

公共班级学生
{
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
公共整数平均值{get;set;}
}
}
公共类Grupa
{ 
公共int名称{get;set;}
公共列表集合学生{get;set;}
公共Grupa()
{
SetStudent=新列表();
}
公开作废印刷品()
{
//Console.WriteLine(“Grupa:+this.Name”);
控制台。书写线(“Studentii din grupa:”);
foreach(此.SetStudent中的学生s)
{
Console.WriteLine(“+s.Name+”+s.姓氏+”--“+s.Average+”\n”);
}
}
}
公开课
{
公共整数{get;set;}
公共列表SetGrupa{get;set;}
公营
{
SetGrupa=新列表();
}
公开作废印刷品()
{
Console.WriteLine(“Anul:+this.Anul”);
控制台写线(“Grupele din acest an:”);
foreach(在这个.SetGrupa中为Grupa g)
{
Console.WriteLine(“+g.Name”);
}
}
}
string[]lines=System.IO.File.ReadAllLines(@“D:\C#\Tema1\Tema1.txt”);
System.Console.WriteLine(“Content Tema1.txt=\n”);
foreach(行中的字符串行)
{
Console.WriteLine(“\t”+行);
}
Console.WriteLine(“\n关闭”);
System.Console.ReadKey();
}

您也可以对该类型的平面文件使用.NET
TextFieldParser

var studentList = new List<Student>();

var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser("<file path>");
parser.SetFieldWidths(4, 4, 12, 8, 2);

while (!parser.EndOfData)
{
     string[] line = parser.ReadFields();

     var student = new Student();
     student.Year = int.Parse(line[0]);
     student.Class = int.Parse(line[1]);
     student.Name = line[2].Trim();
     student.Surname = line[3].Trim();
     student.Average = int.Parse(line[4]);

     studentList.Add(student);
}
var studentList=newlist();
var parser=新的Microsoft.VisualBasic.FileIO.TextFieldParser(“”);
SetFieldWidths(4,4,12,8,2);
而(!parser.EndOfData)
{
string[]line=parser.ReadFields();
var student=新学生();
student.Year=int.Parse(第[0]行);
student.Class=int.Parse(第[1]行);
student.Name=行[2].Trim();
student.姓氏=第[3]行.Trim();
student.Average=int.Parse(第[4]行);
学生列表。添加(学生);
}
您只需在
SetFieldWidths
函数中设置字段长度。

您的问题很模糊,您是否在寻找这样的Linq:

// Parsing into objects
var data = System.IO.File
  .ReadLines(@"D:\C#\Tema1\Tema1.txt")
  .Skip(1) //TODO: comment down this line if your file doesn't have a caption
  .Select(line => line.Split('\t'))
  .Select(items => new { // or "new Student() {" if you've designed a Student class
    Year    = int.Parse(items[0]),
    Class   = int.Parse(items[1]),
    Name    = items[2],
    Surname = items[3],
    Average = int.Parse(items[4]), //TODO: Is it Int32 or Double?
  });

...

// combining back: 
String result = String.Join(Environment.NewLine, data
  .Select(item => String.Join("\t", 
     item.Year, item.Class, item.Name, item.Surname, item.Average));

Console.Write(result);

如果你想完全控制你想做的事情,我建议为每个studet创建一个类

粗略的方法:

namespace ConsoleApplication1
{

    class Student
    {
        //Members of class
        public int Year;
        public int Class;
        public string FirstName;
        public string LastName;
        public int Average;

        /// <summary>
        /// Gets a line and creates a student object
        /// </summary>
        /// <param name="line">The line to be parsed</param>
        public Student(string line)
        {
            //being parsing

            //split by space
            List<String> unfiltered = new List<string>(line.Split(' '));

            //a list to save filtered data
            List<string> filtred = new List<string>();

            //filter out empty spaces...
            //There exist much smarter ways...but this does the job 
            foreach (string entry in unfiltered)
            {
                if (!String.IsNullOrWhiteSpace(entry))
                    filtred.Add(entry);
            }

            //Set variables
            Year = Convert.ToInt32(filtred[0]);
            Class = Convert.ToInt32(filtred[1]);
            FirstName = filtred[2];
            LastName = filtred[3];
            Average = Convert.ToInt32(filtred[4]);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var data = System.IO.File.ReadAllLines(@"d:\data.txt");

            //a list to hold students
            List<Student> students = new List<Student>();

            foreach (var line in data)
            {
                //create a new student and add it to list
                students.Add(new Student(line));
            }

            //to test, write all names
            foreach (var student in students)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + Environment.NewLine);
            }

            //you can calculate average of all students averages!
            int sum = 0;
            for (int i = 0; i < students.Count; i++)
            {
                sum += students[i].Average;
            }

            //print average of all students
            Console.WriteLine("Average mark of all students: " + (sum / students.Count));

            Console.ReadKey();
        }
    }
}
命名空间控制台应用程序1
{
班级学生
{
//班级成员
公共国际年;
公共int类;
公共字符串名;
公共字符串LastName;
公共整数平均数;
/// 
///获取一行并创建一个学生对象
/// 
///要分析的行
公立学生(弦线)
{
//正在解析
//按空间分割
列表未筛选=新列表(行分割(“”));
//保存筛选数据的列表
List FILTED=新列表();
//过滤掉空的空间。。。
//有很多更聪明的方法…但这确实有效
foreach(未筛选中的字符串条目)
{
如果(!String.IsNullOrWhiteSpace(条目))
过滤。添加(条目);
}
//设置变量
年份=转换为32(过滤[0]);
Class=Convert.ToInt32(过滤[1]);
FirstName=filted[2];
LastName=filted[3];
平均值=转换为32(过滤[4]);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var data=System.IO.File.ReadAllLines(@“d:\data.txt”);
//容纳学生的名单
列出学生=新建列表();
foreach(数据中的var行)
{
//创建新学员并将其添加到列表中
添加(新学生(行));
}
//要进行测试,请写入所有名称
foreach(学生中的var学生)
{
Console.WriteLine(student.FirstName+“”+student.LastName+Environment.NewLine);
}
//你可以计算所有学生的平均数!
整数和=0;
for(int i=0;i
您是如何准确阅读的?最好也看看你的代码。Andrei和Roxana是姓氏,是的。@John你想要的输出是什么样子的?所以实际上你这里有读取文件的代码。什么不起作用?将行拆分为字段?可能重复我必须从我的txt中获取所有信息,我不能手动介绍。我发布的代码读取文本文件并创建学生对象。它不是手动介绍…但我真的不明白你说的手动介绍是什么意思。也许试一下代码,看看它能做些什么,也许这有助于理解。你是说你有单独的小组、学生、分数等文件吗?真的不清楚你想做什么。不,我没有单独的文件。我只有一个文件。在我的代码中我有我的连接,我想告诉你我是如何建立这些连接的。我真的不明白你到底想做什么。也许你可以试着在你的问题中一步一步地写出来?我有一个转折点。在items=>new{An=int.Parse(items[0])中,
namespace ConsoleApplication1
{

    class Student
    {
        //Members of class
        public int Year;
        public int Class;
        public string FirstName;
        public string LastName;
        public int Average;

        /// <summary>
        /// Gets a line and creates a student object
        /// </summary>
        /// <param name="line">The line to be parsed</param>
        public Student(string line)
        {
            //being parsing

            //split by space
            List<String> unfiltered = new List<string>(line.Split(' '));

            //a list to save filtered data
            List<string> filtred = new List<string>();

            //filter out empty spaces...
            //There exist much smarter ways...but this does the job 
            foreach (string entry in unfiltered)
            {
                if (!String.IsNullOrWhiteSpace(entry))
                    filtred.Add(entry);
            }

            //Set variables
            Year = Convert.ToInt32(filtred[0]);
            Class = Convert.ToInt32(filtred[1]);
            FirstName = filtred[2];
            LastName = filtred[3];
            Average = Convert.ToInt32(filtred[4]);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var data = System.IO.File.ReadAllLines(@"d:\data.txt");

            //a list to hold students
            List<Student> students = new List<Student>();

            foreach (var line in data)
            {
                //create a new student and add it to list
                students.Add(new Student(line));
            }

            //to test, write all names
            foreach (var student in students)
            {
                Console.WriteLine(student.FirstName + " " + student.LastName + Environment.NewLine);
            }

            //you can calculate average of all students averages!
            int sum = 0;
            for (int i = 0; i < students.Count; i++)
            {
                sum += students[i].Average;
            }

            //print average of all students
            Console.WriteLine("Average mark of all students: " + (sum / students.Count));

            Console.ReadKey();
        }
    }
}