猿问

C# 将文本附加到某一行

我尝试在一个文本文件中构建一些表格,如下所示:


Name           Grade


--------------------

John           100


Mike           94

...

...

我有这一堆代码:


List<string> NamesList = new List<string>();

            List<int> Grades = new List<int>();

            Grades.Add(98);

            Grades.Add(100);

            NamesList.Add("John");

            NamesList.Add("Alon");




            if (NamesList.Count() == Grades.Count())

            {

                var length = NamesList.Count();

                var min = Grades.Min();

                var max = Grades.Max();

                using (System.IO.StreamWriter myF =

                    new System.IO.StreamWriter(@"C:\Users\axcel\textfolder\myFile.txt", true))

                {

                    for (int i = 0; i < length; i++)

                    {

                        if (i == 0)

                        {

                            myF.WriteLine("Name           Age           Grade");

                            myF.WriteLine("==================================");

                        }


                        myF.WriteLine(NamesList.ElementAt(i));

                        myF.WriteLine("         ");

                        myF.WriteLine(Grades.ElementAt(i));


                    }

                }


            }

但我的问题是,在它写在一个新行的名字之后写成绩。我想把它一起写成一个字符串并流式传输,但我想避免额外的计算......我该如何解决它?


梦里花落0921
浏览 351回答 4
4回答

jeck猫

WriteLine()始终在文本后添加新行。所以在你的情况下应该是&nbsp;myF.Write(NamesList.ElementAt(i));&nbsp;myF.Write("&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;");&nbsp;myF.WriteLine(Grades.ElementAt(i));

侃侃尔雅

您始终可以使用字符串插值对齐来对齐文本。为了遵循一些评论,我还敦促您建立一个持有这些价值观的类。public class Student{&nbsp; &nbsp; public string Name { get; set; }&nbsp; &nbsp; public int Age { get; set; }&nbsp; &nbsp; public int Grade { get; set; }}这是使用字符串插值对齐的代码var students = new List<Student>{&nbsp; &nbsp; new Student {Name = "John", Age = 10, Grade = 98},&nbsp; &nbsp; new Student {Name = "Alon", Age = 10, Grade = 100}};var minGrade = students.Min(s => s.Grade);var maxGrade = students.Max(s => s.Grade);using (var myF = new System.IO.StreamWriter(@"C:\Users\axcel\textfolder\myFile.txt", true)){&nbsp; &nbsp; myF.WriteLine($"{"Name",-15}{"Age",-10}{"Grade",5}");&nbsp; &nbsp; myF.WriteLine("==============================");&nbsp; &nbsp; foreach (var student in students)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; myF.WriteLine($"{student.Name,-15}{student.Age,-10}{student.Grade,5}");&nbsp; &nbsp; }}这将产生以下结果:Name&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Age&nbsp; &nbsp; &nbsp; &nbsp;Grade==============================John&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;98Alon&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;10&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 100正数右对齐,负数左对齐您可以在 Microsoft Docs的字符串插值页面上阅读有关它的更多信息

烙印99

var students = new List<(string name, int age, int grade)>(){&nbsp; &nbsp; ("John", 21, 98),&nbsp; &nbsp; ("Alon", 45, 100)};students.Add(("Alice", 35, 99));using (var writer = new StreamWriter("myFile.txt")){&nbsp; &nbsp; writer.WriteLine(string.Join("\t", "Name", "Age", "Grade"));&nbsp; &nbsp; foreach(var student in students)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; writer.WriteLine(string.Join("\t", student.name, student.age, student.grade));&nbsp; &nbsp; }}正如一些评论所建议的那样,您可以使用学生类来对姓名、年龄和年级进行分组。在这个例子中,我使用了一个值元组。您可以看到它如何提高代码的可读性,并且您可以专注于您实际尝试解决的问题。您可以将写入操作简化为简单易读的表达式——这意味着您不太可能犯错误,例如混淆 Write 和 WriteLine。

HUX布斯

要解决您遇到的问题,您可以使用:&nbsp;myF.WriteLine(NamesList.ElementAt(i) + " &nbsp; &nbsp; &nbsp; &nbsp; " + Grades.ElementAt(i));但是,您提供的代码将受益于注释中所述的修改(创建一个类,使用 FileHelpers 等)
随时随地看视频慕课网APP
我要回答