c# - 将文本文件转换为列表(C#)
问题描述
我正在使用此链接作为起点。我对 C# 完全陌生,但在 C/C++ 方面有经验。我的目标是重新创建排序算法并让它们使用分叉相互竞争。我已经成功地重新创建了归并排序、冒泡和插入,并计划实施快速排序。
我创建了一个单独的类,该类创建一个包含 100,000 个随机整数的文件,以正确测试排序算法的速度。
StreamWriter sw = new StreamWriter(@"C:\pathtofile\randomNumbers.txt");
int count = 0;
Random rnd = new Random();
int randomNumber;
int lines = 0;
while (count++ < 100000)
{
randomNumber = rnd.Next(1, 250);
sw.Write(randomNumber);
sw.Write(" "); // create white space
if(lines == 25) //formatting
{
sw.WriteLine("");
lines = 0;
}
lines++;
}
我从将这些整数存储到数组列表中的主类中得到的错误此时失败:
lists.Add(Convert.ToInt32(listInts[j]));
//错误:System.FormatException:'输入字符串的格式不正确。'
据我所知,当它转换整数时,它会获取一个不是整数的值并失败。但是,对我来说令人困惑的部分是当我手动输入整数时它工作得很好。
例如:134 0 13 42 232 48 424 166 109
任何帮助将不胜感激。
C#Nooby
解决方案
正如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
要读取文件并将其内容转换为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
这将确保无错误的字符串到整数的转换。
下面,您可以找到一个完整的最小工作解决方案来解决您的问题。
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);
}
}
}
推荐阅读
- database - CAP 定理中可用性和分区容限的区别
- reactjs - 如何正确附加到在功能组件中作为道具传递的字符串数组
- r - R:将向量放入箱中,然后找到这些箱的平均值
- python - 如何在熊猫数据框中获取特定日期/时间的所有历史值?
- sql - JSON_EXTRACT 不适用于 BigQuery 中的布尔值
- javascript - 无法将来自 Joke API 服务器的响应呈现到视图 ASP.NET Core 5.0 MVC
- reactjs - 如何使 VSCode 和 Prettier 扩展忽略 React JSX 元素的空格?
- javascript - 使用 acuityscheduling API 表达
- c - 用空格替换hypen(指针错误)语言c
- c# - 为什么工作服务模板没有像 systemd 一样正常关闭?