【问题标题】:How to create mutlidimensional list for this in C#?如何在 C# 中为此创建多维列表?
【发布时间】:2023-03-23 12:17:01
【问题描述】:

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

我需要这样的结构:

-----------------------------
|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;
}

【问题讨论】:

  • 问题很简单。您只创建一个行对象并将其插入多次。您必须为每一行创建一个新列表。看看我的回答。

标签: c# arrays list multidimensional-array


【解决方案1】:

不确定我是否理解正确。

        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”的消息框。

【讨论】:

  • 好的,我如何获取“表”中的“行”数来测试我是否正确?
  • table.Count() 返回行数。
  • 您可以按照@danbruc 的建议使用 table.Count() :) 对于单个行,使用 table[0].Count()
【解决方案2】:

您应该能够像处理列表中的列表一样使用它。

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

【讨论】:

    【解决方案3】:
    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) 只是伪代码。此外,您可以将正文中的 to 行合并为一行。

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

    【讨论】:

      【解决方案4】:

      您正在描述jagged array。我不完全确定 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 变量,但您通常事先不知道。所以你建立一个列表并在完成后返回一个数组。这增加了更多的开销,然后只返回列表。
      • 如果您稍后必须操作数据,您可能会再次创建一个列表,因为您需要添加或删除某些内容。因此,由于获得了灵活性,我绝对更喜欢列表。在引擎盖下它只是一个具有一些智能调整大小的数组 - 没有那么多开销。
      • 我提供它作为替代方案,并且已经注意到在更改数据的情况下使用它们是不明智的。根据数据的大小,提前知道某些属性可能是明智之举,因此 List 可以提前预留大容量。
      【解决方案5】:

      如果您尝试从文件中读取,请尝试以下操作(注意以下代码尚未通过编译器运行)

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

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 1970-01-01
        • 2017-02-19
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多