无法在C#中获取数组总和

时间:2017-06-10 02:28:45

标签: c# arrays file

我编写了下面的代码来读取包含数组数组的文件,然后添加它们并显示结果。但是,我收到链接中提供的错误消息。是什么原因?

using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Xml.Schema;


class ReadFromFile
{
   public static void Main()

{

    StreamReader rea=new StreamReader(@"c:\users\user\desktop\try.txt");
    var lineCount =File.ReadLines(@"c:\users\user\desktop\try.txt").Count();
    int count=(int) lineCount;
    List<int> ad = new List<int>();

   for (int ind = 0; ind < count; ind++)
    {

        Console.WriteLine(rea.ReadLine());

        ad.Add(Int32.Parse(rea.ReadLine()));

    }

     int[] num = ad.ToArray();

     int summ=num.Sum();

    rea.Close();

    Console.WriteLine(summ);

    Console.ReadKey();

}
}

enter image description here

2 个答案:

答案 0 :(得分:0)

您的错误来自以下几行:

Console.WriteLine(rea.ReadLine());
ad.Add(Int32.Parse(rea.ReadLine()));

您正在进行的是获取文件中行数的计数。假设您的文件有10行。当循环到达最后一行并在ReadLine中调用Console.WriteLine(rea.ReadLine());方法时,它将返回最后一行。但是你再次在Readline中调用ad.Add(Int32.Parse(rea.ReadLine()));方法,并且它返回null,因为已经到达文件末尾(EOF)并且Int32.Parse抛出异常,因为它无法将null转换为数字

这是MSDN关于ReadLine方法:

  

输入流的下一行,如果到达输入流的末尾,则为null。

因此,您不仅会获得异常,而且您的总和也将关闭,因为您的ad列表只包含文件中一半的数字。因此,如果您的文件有10行,则只有5个数字。

<强>修正

如果您的文件包含数字并且您确定它们是数字,则可以使用Int32.Parse。如果您不确定,请使用Int32.TryParse尝试,如果失败则返回false。如果您只需要总和而不是其他任何东西,您可以在一行代码中执行此操作:

File.ReadLines("PathOfYourFile").Sum(line => int.Parse(line));

如果您不确定该文件可能包含非数字数据,请按以下步骤操作:

File.ReadLines("PathOfYourFile").Sum(line => 
    {
        int possibleNumber;
        if (int.TryParse(line, out possibleNumber)
        {
            // success so return the number
            return possibleNumber;
        }
        else
        {
            // Maybe log the line number or throw the exception to 
            // stop processing the file or 
            // return a zero and continue processing the file
            return 0; 
        }
    }

最后,如果你想按自己的方式去做,请删除这一行,如果你的文件只有数字,那么一切都应该没问题:

// remove this so you do not read the line
Console.WriteLine(rea.ReadLine()); 

答案 1 :(得分:0)

1)由于使用了Parse方法,因此出现此错误。当编译器无法将输入转换为Int32时,Parse方法会抛出异常。

使用TryParse,如果转换为OK则返回true,否则返回false:

string[] lines = System.IO.File.ReadAllLines(@"c:\try.txt");

int number;
int sum = lines.Sum(line => Int32.TryParse(line, out number) ? number : 0);
Console.WriteLine(sum);

2)当您在循环的一个步骤中调用ReadLine两次时,逻辑错误。因此,您只能在数组中添加偶数行。