将多个字符串行解析为数字

时间:2016-04-17 11:25:34

标签: c# string parsing integer

我有这样的代码:

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

我想TryParse list_lines所以它们是数字,而不是字符串。 是否有可能“批量”'不知怎的? 每行在拆分后由5个字符串组成。

修改

我写了这个:

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

但是我在list_lines []上遇到错误,它说必须有一个值。

3 个答案:

答案 0 :(得分:0)

您可以使用SelectMany展平列表。

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

如果可以有非数字单元格并且您正在寻找正数,则可以添加Where子句

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

答案 1 :(得分:0)

一种方法:

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

答案 2 :(得分:0)

基于your previous question,您似乎想要通过将第三个拆分结果排序为int ,然后您可以这样做:

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

我在int.MaxValue失败时默认使用TryParse。这样,失败的线路将是最后的。如果您希望首先出现失败的行,则可以将默认值更改为int.MinValue

顺便说一句,C#命名约定使用 camel-case 表示变量,例如lineNolistLines,而不是line_nolist_lines

要获得与每一行对应的int[],您可以使用类似的逻辑,但现在采用Select()方法而不是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();