C # ajoute du texte à une certaine ligne

J'essaie de construire une table à l'intérieur d'un fichier texte qui ressemble à ca:

Name           Grade

--------------------
John           100

Mike           94
...
...

J'ai ce tas de code:

List NamesList = new List();
            List Grades = new List();
            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));

                    }
                }

            }

mais mon problème est que l’écriture des notes après les noms est écrite dans une nouvelle ligne. Je pensais écrire ensemble une chaîne et la diffuser, mais je voulais éviter une informatique supplémentaire ... Comment puis-je le résoudre?

0
ajouté édité
Vues: 2
Avez-vous essayé de remplacer "Write" au lieu de "WriteLine"?
ajouté l'auteur sudu, source
Avez-vous essayé de remplacer "Write" au lieu de "WriteLine"?
ajouté l'auteur sudu, source
Vous appelez WriteLine et vous êtes surpris de recevoir de nouvelles lignes?
ajouté l'auteur Damien_The_Unbeliever, source
Vous appelez WriteLine et vous êtes surpris de recevoir de nouvelles lignes?
ajouté l'auteur Damien_The_Unbeliever, source
Peut-être une bonne idée de créer une classe d’étudiants (avec nom et note) au lieu d’avoir deux collections.
ajouté l'auteur Magnus, source
Je vous encourage vivement à essayer la bibliothèque FileHelpers. Cela vous aidera beaucoup à écrire/lire des fichiers.
ajouté l'auteur Gonzo345, source
Je vous encourage vivement à essayer la bibliothèque FileHelpers. Cela vous aidera beaucoup à écrire/lire des fichiers.
ajouté l'auteur Gonzo345, source

7 Réponses

WriteLine() always add a new line after your text. So in your case it should be

 myF.Write(NamesList.ElementAt(i));
 myF.Write("         ");
 myF.WriteLine(Grades.ElementAt(i));
3
ajouté

WriteLine() always add a new line after your text. So in your case it should be

 myF.Write(NamesList.ElementAt(i));
 myF.Write("         ");
 myF.WriteLine(Grades.ElementAt(i));
3
ajouté
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));
    }
}

Comme certains commentaires l'ont suggéré, vous pouvez utiliser une classe d'étudiants pour regrouper le nom, l'âge et le grade. Dans cet exemple, j'ai utilisé un valeur Tuple à la place.

Vous pouvez voir comment cela améliore la lisibilité du code et vous pouvez vous concentrer sur le problème que vous essayez réellement de résoudre. Vous pouvez réduire votre opération d'écriture à une expression simple et lisible, ce qui signifie que vous êtes moins susceptible de commettre des erreurs telles que le mélange de Write et WriteLine.

2
ajouté
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));
    }
}

Comme certains commentaires l'ont suggéré, vous pouvez utiliser une classe d'étudiants pour regrouper le nom, l'âge et le grade. Dans cet exemple, j'ai utilisé un valeur Tuple à la place.

Vous pouvez voir comment cela améliore la lisibilité du code et vous pouvez vous concentrer sur le problème que vous essayez réellement de résoudre. Vous pouvez réduire votre opération d'écriture à une expression simple et lisible, ce qui signifie que vous êtes moins susceptible de commettre des erreurs telles que le mélange de Write et WriteLine.

2
ajouté

To solve the issue you are having, you could just use: myF.WriteLine(NamesList.ElementAt(i) + " " + Grades.ElementAt(i));

Cependant, le code que vous avez fourni gagnerait à être modifié comme décrit dans les commentaires (créer une classe, utiliser FileHelpers, etc.)

1
ajouté
La longueur de l'espace intérieur entre Nom et Niveau peut-elle être contrôlée pour que les colonnes "aient une belle apparence"? Par exemple: si le total des caractères d'espace est de 15 alors si name est de 7 caractères, l'espace sera de 15 à 7 = 8 caractères
ajouté l'auteur axcelenator, source
Vous pouvez faire myF.WriteLine (NamesList.ElementAt (i) .PadRight (totalLength - (NamesList.ElementAt (i) .Length + Grades.ElementAt (i) .Length), '') + Grades.ElementAt (i )) mais comme je l'ai déjà dit, je vous suggère fortement de prendre en compte les autres suggestions :-p - La solution @TVOHM est bien meilleure que la solution rapide que je vous ai donnée ...
ajouté l'auteur Leonardo Seccia, source

To solve the issue you are having, you could just use: myF.WriteLine(NamesList.ElementAt(i) + " " + Grades.ElementAt(i));

Cependant, le code que vous avez fourni gagnerait à être modifié comme décrit dans les commentaires (créer une classe, utiliser FileHelpers, etc.)

1
ajouté
La longueur de l'espace intérieur entre Nom et Niveau peut-elle être contrôlée pour que les colonnes "aient une belle apparence"? Par exemple: si le total des caractères d'espace est de 15 alors si name est de 7 caractères, l'espace sera de 15 à 7 = 8 caractères
ajouté l'auteur axcelenator, source
Vous pouvez faire myF.WriteLine (NamesList.ElementAt (i) .PadRight (totalLength - (NamesList.ElementAt (i) .Length + Grades.ElementAt (i) .Length), '') + Grades.ElementAt (i )) mais comme je l'ai déjà dit, je vous suggère fortement de prendre en compte les autres suggestions :-p - La solution @TVOHM est bien meilleure que la solution rapide que je vous ai donnée ...
ajouté l'auteur Leonardo Seccia, source

Solution 1: Pourquoi n'essayez-vous pas de concaténer les deux chaînes comme suit:

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

OU Solution 2: Ce que vous utilisez est WriteLine ("Texte"), une fonction qui écrit toujours le texte sur la ligne suivante. À la place, vous pouvez utiliser la fonction Write ("Texte") qui écrit la chaîne sur la même ligne. vous pouvez essayer comme:

myF.Write(NamesList.ElementAt(i));
myF.Write("         ");
myF.Write(Grades.ElementAt(i));
myF.WriteLine();//Here it will enter to new line
1
ajouté