【问题标题】:Parsing multiple string lines to numbers将多个字符串行解析为数字
【发布时间】:2016-04-17 11:25:34
【问题描述】:

我有这样的代码:

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

我想尝试解析 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[] 上收到错误,它说必须有一个值。

【问题讨论】:

  • 您是真的想得到int[] 还是只是想按line.Split(';')[3] 的结果作为int 而不是string 进行排序?
  • 是的,我想按 int 而非字符串排序结果。
  • 所以看来人们的问题是错误的(或者我可能是)。在下面查看我的答案,看看这是否是您想要做的。
  • 我认为为了进行排序,我需要获取 int。我没有意识到有更简单的方法

标签: c# string parsing integer


【解决方案1】:

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

TryParse 失败时,我使用int.MaxValue 作为默认值。这样,失败的线路将排在最后。如果您希望失败的行首先出现,您可以将默认值更改为 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();

【讨论】:

  • 这对我有用。非常感谢!我现在将研究代码以了解这里做了什么。是的,我在这里忘记了 c# 约定。我将用 _ 重命名变量。
  • 我想这就是我现在需要的。但在未来,我还希望能够对这些字符串到整数的值进行计算,而不仅仅是排序,这是 int 派上用场和必要的地方
  • @paddy 查看上面的第二个代码 sn-p 获取int数组的方法
【解决方案2】:

您可以使用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));

【讨论】:

    【解决方案3】:

    一种方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多