首页 > 解决方案 > 将文本文件转换为列表(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

标签: c#stringarraylisttext-files

解决方案


正如vetzascoaStas 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}");
        }
    }
}

这样,您可以避免在每行末尾出现多余的空格。另外,请注意、和是对象。因此,它们应该在其中一个或块中使用。FileStreamStreamReaderStreamWriterIDisposableusing(...)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);
        }
    }
}


推荐阅读