如何在C#中创建多维列表?

4

我有一个表格(在文件中),我通过空格将其分成了几个块。

我需要的结构如下:

-----------------------------
|21|22|23|33|3323|
|32|32|
|434433|545454|5454|
------------------------------

这更像是每一行都是它自己的表格。我应该怎么做?

我尝试了List<List<string>> matrix = new List<List<string>>(); 但我似乎找不到一种使用它的方法。

编辑 - 有人能告诉我这段代码有什么问题吗?Matrix[0][0]与matrix [1][0]相同..似乎同一行总是添加到矩阵中,但我已经清除了它...

static ArrayList ReadFromFile(string filename)
    StreamReader SR;
    string S;
    string[] S_split;

    SR = File.OpenText(filename);
    S = SR.ReadLine();

    ArrayList myItems = new ArrayList();

    List<List<string>> matrix = new List<List<string>>();
    List<string> row = new List<string>();

    while (S != null)
    {
        row.Clear();
        S_split = S.Split(' ');
        for (int i = 1; i < S_split.GetLength(0); i++)
        {
            row.Add(S_split[i]);
            matrix.Add(row);
        }              

        S = SR.ReadLine();
    }
    Console.WriteLine(matrix[1][1]);
    SR.Close();
    return myItems;
}

问题非常简单。您只创建了一个行对象并多次插入它。您必须为每一行创建一个新列表。请看我的答案。 - Daniel Brückner
5个回答

7

我不确定我是否理解正确。

        List<List<int>> table = new List<List<int>>();
        List<int> row = new List<int>();
        row.Add(21);
        row.Add(22);
        row.Add(23);
        row.Add(33); // and so on
        table.Add(row);

        row = new List<int>();
        row.Add(1001);
        row.Add(1002);
        table.Add(row);

        MessageBox.Show(table[0][3].ToString());

程序应该显示一个带有文本“33”的消息框。

好的,我该如何获取“表格”中的“行数”以测试我的正确性? - Skuta
table.Count() 返回行数。 - Daniel Brückner
你可以像@danbruc建议的那样使用table.Count()来计算表格中的行数。如果要针对单个行进行操作,可以使用table[0].Count()。 - Gant

1

你应该能够像处理列表中的列表一样处理它。

matrix.Add(new List<string>);
matrix[0].Add("a string");

1
List<List<String>> matrix = new List<List<String>>();

foreach (String line in file)
{
   String[] values = line.Split(new Char[] { ' ' });

   matrix.Add(new List<String>(values));
}

只需遍历您的文件,并针对每行执行以下操作。

  1. 生成一个新列表
  2. 填充该行的数据
  3. 将当前行的列表添加到完整文件的列表中

请注意,foreach (String line in file)仅是伪代码。此外,您可以将主体中的两行合并为一行。

matrix.Add(new List<String>(line.Split(new Char[] { ' ' })));

1

你正在描述一个锯齿数组。我不确定使用List是否会过度?如果你只需要从文件中导入数据然后使用它,那么使用锯齿数组就足够简单了。

例如:

int[][] jaggedArray = new int[][] 
{
    new int[] {21, 22, 23, 33, 3323},
    new int[] {32, 32},
    new int[] {434433, 545454, 5454}
};

你也可以在处理文件时使用循环来构建锯齿数组,就像这样:

int[][] result = new int[numberOfLines][];
for (int currentLine = 0; currentLine < numberOfLines; currentLine++)
{
    String line = fileStream.ReadLine();
    int[] values = SplitAndConvertLine(line);
    result[currentLine] = values;
}

使用锯齿数组的问题在于创建时必须知道其大小。虽然您的代码中有numberOfLines变量,但通常事先不知道它的大小。因此,您需要构建一个列表,并在完成后返回一个数组。这比仅返回列表增加了更多开销。 - Daniel Brückner
如果您以后需要操作数据,您可能会再次创建一个列表,因为您需要添加或删除某些内容。因此,我绝对更喜欢列表,因为它具有更高的灵活性。在底层,它只是一个带有一些智能调整大小的数组 - 开销并不大。 - Daniel Brückner
我提供这作为一种选择,并已经指出在数据变化的情况下使用它们不明智。根据数据的大小,事先了解某些属性可能是明智的,因此List可以提前保留大容量。 - Davy Landman

0

如果你正在尝试从文件中读取数据,请尝试以下代码(请注意以下代码尚未通过编译器)

List<string[]> matrix = new List<string[]>();
while(!instream.EndOfStream)
{
    var values = instream.ReadLine().Split(new[] {' '});
    matrix.Add(values);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接