2016-07-04 21 views
-1

Ich schreibe ein C# -Programm in Visual Studio, das eine Textdatei liest und die Zeilen zu einer Liste hinzufügt. Die Textdatei enthält Zeilen mit dem Namen und dem Alter von Personen.Wie man Zeilen von einer Textdatei zu einer Liste speichert?

Name: Amy 
    Age: 30 
    Name: Bob 
    Age: 25 
    .... 

Die Textdatei wird als Parameter an die List-Funktion gesendet.

In der List-Funktion möchte ich jede Zeile aus der Textdatei lesen und sie der Liste hinzufügen (info1).

Ich habe einen Code geschrieben. Aber es gibt Gebäudefehler, wenn ich den Code ausführe.

Es ist ein Fehler in der Leitung

info1.Add(line.ToString()); 

Der Code ist wie folgt:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication 
{ 
    class Class1 
{ 

    public void Main() 
    { 
     List<Info> info1 = Load(@"filename.txt"); 

     Console.ReadKey(); 
    } 


} 


public List<Info> Load(string file) 
    { 
     List<Info> info1 = new List<Info>(); 

     using (StreamReader rdr = new StreamReader(file)) 
     { 
      string line; 

      while ((line = rdr.ReadLine()) != null) 
      { 
       info1.Add(line.ToString());     

      } 
     } 
     return info1; 
    } 



public class Info 
{ 

    public string Name { get; set; } 
    public string Age { get; set; } 

    public Info(string name, string age) 
    { 
     Name = name; 
     Age = age; 

    } 

} 

}

Ich bin mir nicht sicher, ob der Fehler, den ich gemacht habe. Gibt es einen Fehler in meinem Code?

Edit: Ich bin mir nicht sicher, wie Sie den Code korrigieren, um sicherzustellen, dass ich der Liste hinzufügen kann. Wie kann ich den Code korrigieren?

+1

Sie versuchen, hinzuzufügen Typ Zeichenfolge hinzuzufügen, wo es Type Info erwartet –

+1

Seit 'info1' ist ein' Liste info1' Sie nicht hinzufügen können 'string' über' info1. EIN dd (line.ToString()); ' –

+0

Vielen Dank für Ihre Antworten :) – Gajesh

Antwort

0

Dies ist, wie aus jedem Paar von Linien ein Info Objekt zu erstellen:

public static List<Info> Load(string file) 
{ 
    List<Info> results = new List<Info>(); 

    string name = null; 
    foreach (var line in File.ReadAllLines(file)) 
    { 
     bool isName = false; 
     string age = null; 
     if (line.Contains("Name:")) 
     { 
      name = null; 
      isName = true; 
     } 

     string value = line.Split(':')[1]; 

     if (isName) 
      name = value; 
     else 
      age = value; 

     if (!isName) 
     { 
      results.Add(new Info(name, age)); 
      name = null; 
     } 

    } 

    return results; 
} 
2

.ToString()method returnsstring, aber Sie versuchen, es auf eine Liste von Info hinzuzufügen. Deshalb kompiliert dein Code nicht.

Sie müssen zwei Zeilen lesen (erste ist Name Info, die zweite ist eine Altersinfo), create a newInfo Instanz und store it in the list.

0

Sie versuchen, ein List<Info> ein string Objekt hinzuzufügen. Da es sich um eine Art Verletzung ist, der Compiler Sie wahrscheinlich ein Gussfehler geben

0

Liste der Typ ist Info aber Code versucht string, hinzufügen, die eine Ausnahme verursacht.

Dies sollte Ihr Problem beheben, Lösung verwendet Linq.

public List<Info> Load(string file) 
{ 
    List<Info> info1 = new List<Info>(); 
    var contents = File.ReadLines(file) 
     .Select(x=> new {item=x, index=i}) 
     .GroupBy(x=> x.index/2) 
     .Select(x=> new Info() 
     { 
      Name = x.First().item.Split(':')[1], // Name 
      Age = x.Last().item.Split(':')[1]  // Age 
     } 
     .ToList(); 

    info1.AddRange(content); 

    return info1; 
} 
0
List<Info> info1 = new List<Info>(); 

info1 ist ein List<Info>, aber Sie ein string zur Liste hinzufügen:

info1.Add(line.ToString());

Sie sollten ein neues Info Objekt erstellen und es info1 hinzuzufügen.

0
string[] lines = File.ReadAllLines(@"filename.txt"); 
List<Info> infos = new List<Info>(); 
foreach(var line in lines) 
{ 
    string name = ""; 
    string age = ""; 
    if(line.StartsWith("Name:")) 
    { 
     name = line.Replace("Name: ", "");  
    } 
    else if(line.StartsWith("Age:")) 
    { 
     age = line.Replace("Age: ", ""); 
    } 
    Info info = new Info(name, age); 
    infos.Add(info); 
} 
+0

Ich denke, es wird eine Zeile des Namens ohne Einstellung Alter und eine Zeile mit Alter ohne Einstellung des Namens hinzufügen. Wenn Sie die Informationserstellung und -hinzufügung in else-Block einfügen, würde es funktionieren. – Adil

0

Sie benötigen neue Instanz von Info-Klasse erstellen Info-Liste hinzugefügt werden, da der Liste Typ „Info“ und Sie versuchen, „string“

using (StreamReader rdr = new StreamReader(file)) 
    { 
     string line;// for Name 
     string line2;//for Age 

     while ((line = rdr.ReadLine()) != null) 
     { 
      line2= rdr.ReadLine(); 
      info1.Add(new Info(line,line2));     

     } 
    } 
    return info1; 
} 
Verwandte Themen