正如vetzascoa 和Stas Ivanov 所提到的,您的代码中的异常可能是由未处理的空格和空字符串引起的。
为了解决这个问题,您可以修改将测试数据写入文件的方法如下:
static string Delimiter => " ";
static string LineBreak => "\r\n";
static void WriteTestFile(string fileName,
int dataLength = 100000,
int dataMinvalue = 1,
int dataMaxValue = 250,
int lineBreakPosition = 25)
{
int iterator = 0;
string delimiter;
Random rndGenerator = new Random();
int randomNumber;
using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
using (var streamWriter = new StreamWriter(fileStream))
{
while (iterator < dataLength)
{
randomNumber = rndGenerator.Next(dataMinvalue, dataMaxValue);
delimiter = ++iterator % lineBreakPosition == 0 ? LineBreak : Delimiter;
streamWriter.Write($"{randomNumber}{delimiter}");
}
}
}
通过这种方式,您可以避免在每行末尾出现多余的空格。另外,注意 FileStream、StreamReader 和 StreamWriter 是 IDisposable 对象。因此,它们在using(...) 或try/finally 块内should be used。
要读取文件并将其内容转换为List<int>,您可以使用以下代码:
static List<int> ReadTestFile(string fileName)
{
string fileContents;
using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
using (var streamReader = new StreamReader(fileStream))
{
fileContents = streamReader.ReadToEnd();
}
var separators = string.Join("", LineBreak, Delimiter).ToCharArray();
var query = from item in fileContents
.Split(separators, StringSplitOptions.RemoveEmptyEntries)
select int.Parse(item);
return query.ToList();
}
使用StringSplitOptions.RemoveEmptyEntries 选项拆分文件内容字符串将由String.Split 方法生成exclude empty entries/substrings。这将确保无错误的字符串到整数的转换。
您可以在下面找到一个完整的最小可行解决方案来解决您的问题。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace FileToListInt
{
class Program
{
static readonly string filePath = "randomNumbers.txt";
static string Delimiter => " ";
static string LineBreak => "\r\n";
static void WriteTestFile(string fileName,
int dataLength = 100000,
int dataMinvalue = 1,
int dataMaxValue = 250,
int lineBreakPosition = 25)
{
int iterator = 0;
string delimiter;
Random rndGenerator = new Random();
int randomNumber;
using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
using (var streamWriter = new StreamWriter(fileStream))
{
while (iterator < dataLength)
{
randomNumber = rndGenerator.Next(dataMinvalue, dataMaxValue);
delimiter = ++iterator % lineBreakPosition == 0 ? LineBreak : Delimiter;
streamWriter.Write($"{randomNumber}{delimiter}");
}
}
}
static List<int> ReadTestFile(string fileName)
{
string fileContents;
using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
using (var streamReader = new StreamReader(fileStream))
{
fileContents = streamReader.ReadToEnd();
}
var separators = string.Join("", LineBreak, Delimiter).ToCharArray();
var query = from item in fileContents
.Split(separators, StringSplitOptions.RemoveEmptyEntries)
select int.Parse(item);
return query.ToList();
}
static void Main(string[] args)
{
// Writing data to a test file
WriteTestFile(filePath);
// Reading result into a List<int>
List<int> data = ReadTestFile(filePath);
// Checking the number of readings
Console.WriteLine(data.Count);
// Deleting test file
if (File.Exists(filePath))
File.Delete(filePath);
}
}
}