0

如果我知道数据文件的大小,我可以轻松地将数据文件传递给 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];
                }
            }

感谢您的想法:-)

4

5 回答 5

2

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

您可以使用 .Add() 命令添加列,完成后可以将其折叠成一个数组 (.ToArray())

于 2013-08-25T06:56:53.283 回答
1

如果列数始终为 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];
    }
}
于 2013-08-25T07:03:53.557 回答
1

您可以使用包含自定义对象(可以是数组)的 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();
于 2013-08-25T07:00:44.630 回答
1

你可以做如下

var result = File.ReadAllLines("data.txt").Select(x=>x.Split(',')).ToArray();
于 2013-08-25T07:10:00.270 回答
0

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

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;
于 2013-08-25T07:16:07.593 回答