C#如何将未知行大小的数据的文本文件解析为2D数组

本文关键字:文件 文本 数组 2D 数据 未知 | 更新日期: 2023-09-27 18:29:00

如果我知道数据文件的大小,我可以很容易地将数据文件传递给2D数组,但当你想添加和删除数据时,这是毫无意义的。

如何实例化一个数据行长度为全局且不超出程序其余部分范围的2D数组?

这是一个4行6列的数组的常见代码,但我想向数据文件添加/删除数据,使其具有未知的行长度。

  string[,] allStudentData = new string[4, 6];
            string[] allStudents = File.ReadAllLines("data.txt");

            for (int i = 0; i < allStudents.Count(); i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    string[] DataIn = allStudents[i].Split(',');
                    allStudentData[i, j] = DataIn[j];
                }
            }

感谢您的想法:-)

C#如何将未知行大小的数据的文本文件解析为2D数组

为什么不使用可变的东西,比如List?

您可以使用.add()命令添加列,并且可以在使用完它(.ToArray())

后将其折叠成数组

您可以执行以下

var result = File.ReadAllLines("data.txt").Select(x=>x.Split(',')).ToArray();

您可以使用一个包含自定义对象(可以是数组)的List而不是array,然后在最后将列表转换为ToArray扩展名为的数组

var list = new List<string[]>();
var data1 = new string[2] {"1", "2" };
var data2 = new string[3] {"1", "2", "3" };
list.Add(data1);
list.Add(data2);
list.ToArray(); // converts the list to string[][]

读取完文件后,您可以轻松地将更多项目添加到列表中,然后在最后将所有修改写入文件。如果你认为,在未来你需要的不仅仅是二维数组,而是创建一个自定义对象的价值,比如:

public class Student
{
    public string Name { get; set; }
    public int Grade { get; set; }
}

并使用它来代替字符串[]:

var studentData = new List<Student>();

稍后的维护将更加容易(添加地址、类等)。我承认,你在阅读和写作时会有更多的工作要做,但如果项目发展壮大,它会有回报的

您仍然可以使用LINQ读取一行数据:

// creates a List<Student>
var studentData = File.ReadAllLines("data.txt")
                        .Select(row => row.Split(','))
                        .Select(elements => 
                            new Student 
                            {
                                Name = elements[0],
                                Grade = int.Parse(elements[1])
                            }).ToList();

如果列数始终为6,并且只有行数未知。只需将代码的前2行更改为:

string[] allStudents = File.ReadAllLines("data.txt");
string[,] allStudentData = new string[allStudents.Count(), 6];

如果列数未知,则可以执行此操作以获得2D结果

var not2DResult = File.ReadAllLines("data.txt").Select(x => x.Split(',')).ToArray();
var maxRow = not2DResult.Count()-1;
int maxColumn = Enumerable.Select(not2DResult, c => c.Count()).Max()-1;
var result2D = new string[maxRow, maxColumn]; 
for (int rowNumber = 0; rowNumber < maxRow; rowNumber++)
{
    var row = not2DResult[rowNumber];
    for (int columnNumber = 0; columnNumber < row.Count(); columnNumber++)
    {
        result2D[rowNumber, columnNumber] = row[columnNumber];
    }
}

尝试使用Lists来保存文件信息。

var myList = new List<string>();
myList = File.ReadLines("data.txt");
var my2DList = new List<List<string>>();
foreach(string line in myList)
    my2DList.Add(line.Split(','));

如果你想知道行数,只需使用:

int numberOfLines = my2DList.Count;

对于单行中的项目数量:

int lengthOfLine3 = my2DList[3].Length;