2017-09-14 1 views
1

Ich habe ein Programm, das zwei Textdateien für ein bestimmtes Feld überprüft, dann überprüft, ob eine Datei das angegebene Feld hat. Wenn dies der Fall ist, wird die Anzahl der Übereinstimmungen in einer anderen Liste gespeichert. Das Problem, das ich habe, ist, dass es nur die erste Übereinstimmung mit der Textdatei schreibt, wenn ich weiß, dass ich zwei Übereinstimmungen habe. Ich bin ziemlich neu in C#, also jede Hilfe/Beratung würde geschätzt werden, der Code unten tut die Überprüfung.Inhalt der Liste schreiben <string> in eine Textdatei

while ((lineBeingRead = fileToRead.ReadLine()) != null) 
{ 
    if (lineBeingRead.IndexOf("  :22:", 0) == 0) 
    { 
     lstTwentyOneCounter.Add(lineBeingRead.Substring(11)); 
     lstStoreTwentyOne = lstTwentyOneCounter; 
    } 
} 

Der folgende Code schreibt in die Textdatei.

foreach (var single103 in lstStore103) 
{ 
    foreach (var single101 in lstStore101) 
    { 
     if (single101 == single103) 
     { 
      checkResults.Add(single103); 
      System.IO.File.WriteAllText(@"H:\Compare.txt", single103); 
      break; 
     } 
    } 
} 

Danke,
Ryan

+1

Siehe auch: [System.IO.File.WriteAllLines] (https://msdn.microsoft.com/library/dd383463. aspx) – Corak

Antwort

2

WriteAllText wird die vorhandene Datei overwrite - so dass nur ein einziger Eintrag geschrieben werden angezeigt.

Sie möchten append oder write all stattdessen.

System.IO.File.Delete(@"H:\Compare.txt"); 

foreach (var single103 in lstStore103) 
{ 
    foreach (var single101 in lstStore101) 
    { 
     if (single101 == single103) 
     { 
      checkResults.Add(single103); 
      System.IO.File.AppendAllText(@"H:\Compare.txt", single103 + Environment.NewLine); 
     } 
    } 
} 

oder (wenn weder lstStore103 noch lstStore101 Duplikate haben):

System.IO.File.Delete(@"H:\Compare.txt"); 

foreach (var value in lstStore103.Intersect(lstStore101)) 
{ 
    checkResults.Add(value); 
    System.IO.File.AppendAllText(@"H:\Compare.txt", value + Environment.NewLine); 
} 
+0

Danke, dass es behoben wurde, ich weiß, dass es refaktoriert und sauberer sein muss, aber jetzt funktioniert es, also bin ich glücklich :) – RyanK

+0

@RyanK Achten Sie darauf, Tims Antwort ebenfalls zu verbessern (der Pfeil nach oben auf der linken Seite seines Beitrags) . – mjwills

2

Die break; verantwortlich ist, wird es die Schleife verlassen. Aber Sie wollen auch nicht WriteAllText verwenden, die die gesamte Textdatei schreibt, aber Sie möchten eine neue Zeile anhängen. Ich würde diesen Ansatz verwenden:

string startPattern = "  :22:"; 
List<string> lstStoreTwentyOne = File.ReadLines(path) 
    .Where(l => l.StartsWith(startPattern)) 
    .Select(l => l.Substring(startPattern.Length)) 
    .ToList(); 

Dies wird erstellen und füllen Sie die Liste. Ich weiß nicht, wie das mit der lstStore103-Liste zusammenhängt.

Dies wird jedoch alle auf den Text-Datei schreiben und ersetzt Ihre Loops:

var matchingItems = lstStore103.Intersect(lstStore101); 
File.WriteAllLines(@"H:\Compare.txt", matchingItems); 
+0

Danke für die Antwort Tim es ist wirklich hilfreich, ich habe mjwillis als die Antwort akzeptiert, wie für jetzt dies funktioniert, um meine Bedürfnisse zu erfüllen, aber ich werde definitiv Ihre verwenden, wenn ich den Code umgestalten, wieder zu schätzen die Hilfe. – RyanK