【问题标题】:Trouble Converting string [] to int []将字符串 [] 转换为 int [] 时遇到问题
【发布时间】:2022-02-01 05:30:52
【问题描述】:
using System;
using System.IO;

namespace Test_Arrays_and_Files
{  
    class Program
    {
        static void Main(string[] args)
        {
            string tFile = @"C:\Programming\GLO\DC\dcw.txt";
            string read = File.ReadAllText(tFile);
            string[] test = read.Split(',');
            int[] ints = Array.ConvertAll(test, int.Parse);
            Console.WriteLine(ints[0]);                  
        }        
    }
}

输入数据:

文本文件内容:(每行 1 个值,)

35,
35,
40,
40,
40,

获取 System.FormatException:输入字符串的格式不正确 请帮助并为糟糕的帖子感到抱歉,我是新来的

【问题讨论】:

  • dcw.txt的内容是什么?
  • 嗨,我很抱歉这篇文章太糟糕了,我在让论坛接受我的问题时出错。我知道在这里发布和回答了类似的问题,但这些解决方案还没有为我工作。 (可能是我做错了)所以我一直在尝试将 string[] 测试转换为 int[],我希望所有索引都能正确排列,但我每次都遇到输入字符串的格式问题我尝试运行该程序。我试过 s=> int.Parse (格式问题)和 linq 但可以让 .Select 工作
  • 35, 35, 40, 40, 40, (每个值在不同的行)
  • 建议您在进行拆分之前从包含文件内容的字符串中删除行尾。另外,在进行拆分时,我相信可以选择删除空格和空条目。

标签: c# arrays string linq type-conversion


【解决方案1】:

您的代码中有两个问题,

  1. 您的字符串以, 结尾,这会在拆分后创建空记录。这就是您收到错误的原因。
  2. 您的分隔符可以是$",{Environment.NewLine}",而不仅仅是','

所以要将给定的string 转换为int 数组,首先将Trim() 输入字符串由, 分割,然后由$",{Environment.NewLine}" 分割。

喜欢,

using System.Linq;
...
var result = str.Trim(',') //Remove leading and trailing comma(s), You can use `TrimEnd()` as well
      .Split($",{Environment.NewLine}", StringSplitOptions.RemoveEmptyEntries)   //Split by given delimiter.
      .Select(int.Parse)
      .ToArray();    //Convert string[] to int[]

Try online

【讨论】:

  • 请注意,进行更改 2) 会主动导致在某些情况下出现问题,例如在 Linux 上解析在 Windows 中创建的文件
  • @CaiusJard,如果我没记错的话,您指的是Environment.NewLine 可能会在不同的操作系统上产生问题。然后我们可以只用, 分割,删除空条目。我会尽快更新我的答案,一旦完成会通知
  • 感谢您抽出宝贵时间为我指明正确的方向。其他用户回答解决了我的问题,但如果需要,请随时发布您的更新答案。我对此很陌生,所以我总是对不同的观点持开放态度。再次感谢您抽出时间来做这件事!干杯!
【解决方案2】:

你得到它只是因为文件末尾有一个逗号,这意味着 Split 最终会在最后一个位置产生一个空字符串。 int.Parse 会被空字符串阻塞

有很多方法可以解决这个问题,一种是告诉 Split 不要返回空的东西,方法是将代码的拆分行更改为:

string[] test = read.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries);

您可以改为修剪末尾的逗号,但使用上述方法意味着您的解析也可以在文件中间的空白行中保留下来,因此总体而言它更健壮

通常在解析字符串时,使用 TryParse 比使用 Parse 更健壮。 TryParse 接受 number 变量来设置结果并返回一个布尔值,告诉你解析是否成功

int[] ints = Array.ConvertAll(test, GetIntOrMinusOne);


//put a method helper
private int GetIntOrMinusOne(string s){
  if(int.TryParse(s, out var t)
    return t;
  return -1;
}

为此,我们需要更多地参与ConvertAll 调用。与其告诉 ConvertAll 调用像 int.Parse 这样的“将字符串转换为 int 的方法”,我们需要编写自己的 mini 方法来尝试解析,如果它失败返回类似 -1 的东西,然后指定 作为调用来进行转换的方法,而不是 int.Parse

重要的是要注意,这会将 -1 引入到结果 int[] 数组中,只要字符串数组中有错误数据。在您以后的处理中,您将进行一些检查以避免它们(例如跳过它们)

您可以通过将方法转换为 lambda 来缩短上面的代码:

int[] ints = Array.ConvertAll(test, s => int.TryParse(s, out var t) ? t : -1);
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                a lambda; "just the important parts of a method"

但从其余代码的风格来看,我不确定您是否会遇到过 lambdas

【讨论】:

  • 谢谢!!您提供的方法助手对我来说效果很好!你是对的风格。不到一周前,我才开始尝试学习编码。我必须承认我不完全理解代码发生了什么,但我会花时间去剖析它。我非常感谢您花时间回答这个问题。我会尽量不经常发布烦人的问题,并在依赖他人寻求帮助之前进行自己的研究。再次感谢您!
  • 也许最简单的剖析方法是单击第一行,按 F9 使其变为红色并运行程序。当黄色条停止时,按 f10 一次移动一步 d 看到 mx 使用鼠标 o 指向变量名称以查看它们的当前值
猜你喜欢
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
相关资源
最近更新 更多