C # добавить текст к определенной строке - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь построить некоторую таблицу внутри текстового файла, который выглядит следующим образом:

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));

                    }
                }

            }

, но моя проблема заключается в том, что написаниеоценки после имен, которые он пишет в новой строке.Я думал о том, чтобы записать это вместе в строку и в потоковую передачу, но я хочу избежать дополнительных вычислений ... Как я могу решить это?

Ответы [ 5 ]

0 голосов
/ 14 декабря 2018

Вы всегда можете выровнять текст, используя выравнивание с интерполяцией строк.

Чтобы следовать некоторым комментариям, я также призываю вас создать класс, содержащий значения.

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Grade { get; set; }
}

ИВот код, использующий выравнивание с интерполяцией строк

var students = new List<Student>
{
    new Student {Name = "John", Age = 10, Grade = 98},
    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))
{
    myF.WriteLine($"{"Name",-15}{"Age",-10}{"Grade",5}");
    myF.WriteLine("==============================");

    foreach (var student in students)
    {
        myF.WriteLine($"{student.Name,-15}{student.Age,-10}{student.Grade,5}");
    }
}

Это даст следующий результат:

Name           Age       Grade
==============================
John           10           98
Alon           10          100

Положительные числа выровнены по правому краю, а отрицательные числа выровнены по левому краю

Подробнее об этом можно прочитать на странице интерполяция строк в Microsoft Docs

0 голосов
/ 14 декабря 2018
var students = new List<(string name, int age, int grade)>()
{
    ("John", 21, 98),
    ("Alon", 45, 100)
};

students.Add(("Alice", 35, 99));

using (var writer = new StreamWriter("myFile.txt"))
{
    writer.WriteLine(string.Join("\t", "Name", "Age", "Grade"));

    foreach(var student in students)
    {
        writer.WriteLine(string.Join("\t", student.name, student.age, student.grade));
    }
}

Как отмечают некоторые комментарии, вы можете использовать класс ученика для группировки имени, возраста и класса.В этом примере вместо этого я использовал Value Tuple .

Вы можете увидеть, как это улучшает читабельность кода, и вы можете сосредоточиться на проблеме, которую вы на самом деле пытаетесь решить.Вы можете сократить вашу операцию записи до простого читаемого выражения - это означает, что вы с меньшей вероятностью допустите ошибки, такие как смешивание Write и WriteLine.

0 голосов
/ 14 декабря 2018

Чтобы решить проблему, с которой вы столкнулись, вы можете просто использовать: myF.WriteLine(NamesList.ElementAt(i) + " " + Grades.ElementAt(i));

Однако предоставленный вами код выиграет от изменения, как описано в комментариях (создайте класс, используйте FileHelpers и т. Д.).)

0 голосов
/ 14 декабря 2018

Решение 1: Почему вы не пытаетесь объединить две строки, например:

   string line = NamesList.ElementAt(i) + "         " + Grades.ElementAt(i);
   myF.WriteLine(line);

ИЛИ Решение 2: Вы используете функцию WriteLine ("Text"), которая всегда записывает текст следующимлиния.Вместо этого вы можете использовать функцию Write ("Text"), которая будет записывать строку в той же строке.Вы можете попробовать как:

myF.Write(NamesList.ElementAt(i));
myF.Write("         ");
myF.Write(Grades.ElementAt(i));
myF.WriteLine(); // Here it will enter to new line
0 голосов
/ 14 декабря 2018

WriteLine() всегда добавляйте новую строку после вашего текста.Так что в вашем случае это должно быть

 myF.Write(NamesList.ElementAt(i));
 myF.Write("         ");
 myF.WriteLine(Grades.ElementAt(i));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...