2016-04-17 8 views
0

Ich habe einen solchen Code:Parsing mehrere String-Linien-Nummern

string[] list_lines = System.IO.File.ReadAllLines(@"F:\VS\WriteLines.xls"); 

System.Console.WriteLine("Contents of Your Database = "); 

foreach (var line in list_lines.OrderBy(line => line.Split(';')[3])) 
     { 

      Console.WriteLine("\t" + line); 
     } 

Ich mag würde die list_lines TryParse, so dass sie Zahlen sind, keine Strings. Ist es möglich, es irgendwie zu "bulk"? Jede Zeile besteht aus 5 Zeichenfolgen, nachdem sie geteilt wurden.


EDIT

ich dies schrieb:

string[] list_lines = System.IO.File.ReadAllLines(@"F:\VS\WriteLines.xls"); 


     int[] newList; 
     // Display the file contents by using a foreach loop. 
     System.Console.WriteLine("Contents of Your Database = "); 
     int.TryParse(list_lines[], out newList); 

     foreach (var line in newList.OrderBy(line => line.Split(';')[3])) 
     { 

      // Use a tab to indent each line of the file. 
      Console.WriteLine("\t" + line); 
     } 

Aber ich auf list_lines bekommen Fehler [], sagt es, dass es ein Wert sein muss.

+0

Versuchen Sie wirklich zu bekommen 'int []' oder Sie wollen eigentlich nur nach dem Ergebnis von line.Split (';') [3] '* als int anstelle von string * ordern? – har07

+0

Ja, ich möchte result by int nicht string bestellen. – paddy

+0

So scheint es, dass Leute die Frage falsch bekommen (oder vielleicht bin ich). Überprüfen Sie meine Antwort unten und sehen Sie, ob es das ist, was Sie vorhatten. – har07

Antwort

0

Basierend auf your previous question, scheint es, dass Sie die Zeilen von das 3. Split-Ergebnis als int dann bestellen möchten Sie können auf diese Weise tun:

foreach (var line in list_lines.OrderBy(line => 
           { 
            int lineNo; 
            var success = int.TryParse(line.Split(';')[3], out lineNo); 
            if(success) return lineNo; 
            return int.MaxValue; 
           })) 
{ 
    Console.WriteLine("\t" + line); 
} 

Ich verwende int.MaxValue als Standard für wenn TryParse ausfällt. Auf diese Weise kommen fehlgeschlagene Zeilen als letzte. Sie können den Standardwert stattdessen auf int.MinValue ändern, wenn die fehlerhaften Zeilen zuerst angezeigt werden sollen.

By the way, C# Namenskonvention verwendet Kamel-Fall für Variablen, wie lineNo und listLines statt line_no und list_lines.


int[] zu erhalten, die jeder Zeile entspricht, können Sie ähnliche Logik verwenden, aber jetzt in einem Select() Verfahren statt OrderBy():

int[] newList = list_lines.Select(line => 
          { 
           int lineNo; 
           var success = int.TryParse(line.Split(';')[3], out lineNo); 
           if(success) return lineNo; 
           return int.MaxValue; //or whatever default value appropriate 
          }) 
          .ToArray(); 
+1

Das funktionierte für mich. Danke vielmals! Ich werde jetzt den Code studieren, um zu verstehen, was hier gemacht wurde. Und ja, ich habe die C# Konvention hier vergessen. Ich werde vars mit _ umbenennen. – paddy

+0

Ich denke, jetzt ist das, was ich brauche. Aber in der Zukunft möchte ich auch in der Lage sein, Berechnungen über diese String-to-Integer-Werte zu machen, und nicht nur die Reihenfolge und das ist wo Int ist praktisch und notwendig – paddy

+0

@paddy Sehen Sie das 2. Code-Snippet oben für eine Möglichkeit, die zu bekommen Array von 'int' – har07

0

Sie können SelectMany verwenden, um die Liste zu reduzieren.

list_lines.SelectMany(line => line.Split(';')).Select(cell => int.Parse(cell)); 

Wenn es kann nicht-Zahl Zellen sein, und Sie werden für positive Zahlen suchen, können Sie eine Where Klausel

list_lines.SelectMany(line => line.Split(';')).Where(cell => cell.All(@char => char.IsDigit(@char))).Select(cell => int.Parse(cell)); 
0

Eine Möglichkeit, es zu tun hinzuzufügen:

int number; 
var intList = list_lines.Select(s => s.Split(';') 
             .Where(p => Int32.TryParse(p, out number)) 
             .Select(y => Int32.Parse(y))) 
             .SelectMany(d=>d).ToList();