【问题标题】:populate Jagged Array with files C#用文件 C# 填充锯齿状数组
【发布时间】:2013-03-23 04:45:20
【问题描述】:

我似乎无法弄清楚如何使用锯齿状数组和文件。我有三个带有数字的文件,并且想将每个文件读入它自己的数组中。这就是我到目前为止所拥有的。试图填充 [0] 数组但无济于事。任何帮助表示赞赏。也找不到任何有关执行此操作的教程。

private void button1_Click(object sender, EventArgs e)
{
    StreamWriter section1;
    StreamWriter section2;
    StreamWriter section3;
    StreamReader section1read;
    StreamReader section2read;
    StreamReader section3read;

    section1 = File.CreateText("Section1.txt");
    section2 = File.CreateText("Section2.txt");
    section3 = File.CreateText("Section3.txt");

    int[][] Scores = new int[3][];

    Random randnum = new Random();

    for (int i = 0; i < 12; ++i)
    {
        int num = randnum.Next(55, 99);
        section1.WriteLine(num);
    }

    for (int j = 0; j < 8; ++j)
    {
        int num1 = randnum.Next(55, 99);
        section2.WriteLine(num1);
    }

    for (int k = 0; k < 10; ++k)
    {
        int num3 = randnum.Next(55, 99);
        section3.WriteLine(num3);
    }

    section1.Close();
    section2.Close();
    section3.Close();

    section1read = File.OpenText("Section1.txt");

    int nums = 0;
    while (!section1read.EndOfStream)
    {
        Scores[0][nums] = int.Parse(section1read.ReadLine());
        ++nums;
    }
    for (int i = 0; i < Scores.Length; ++i)
    {
        listBox1.Items.Add(Scores[0][i]);
    }
    section1read.Close();
}

【问题讨论】:

  • Scores.Length--> Scores[0].Length ?出了什么问题?编译错误,异常?
  • 列表框中有什么显示吗?看起来 Scores[0].Length 的错误只会导致第一个项目出现。
  • 我在 section1read.ReadLine() 上收到 NullReferenceException 未处理错误
  • @AaronLS 没有出现在列表中
  • Scores 是如何声明和初始化的?您需要显示所有代码。

标签: c# file jagged-arrays


【解决方案1】:

锯齿状数组应该分两步初始化:

  1. 数组本身:

    int[][] Scores = new int[3][];
    
  2. 子数组:

    Scores[0] = new int[12];
    Scores[1] = new int[8];
    Scores[2] = new int[10];
    

数组是一个固定长度的数据结构。如果事先不知道大小,就得使用动态长度结构。最好的选择是List&lt;&gt; class:

List<List<int>> scores = new List<List<int>>();

scores.Add( new List<int>() );

using( StreamReader section1read = File.OpenText("Section1.txt"))
{
    string line;
    while ((line = section1read.ReadLine()) != null)
    {
        scores[0].Add(int.Parse(line));
    }
}

还有其他需要考虑的事项:

  • 使用using 块确保与文件关联的所有非托管资源都已释放。
  • 可以查看StreamReader.ReadLine()的返回值来判断文件结束

【讨论】:

  • 这是我的另一个问题。锯齿状数组是否必须始终初始化?如果我不知道尺寸怎么办?
  • @MD.Unicorn 我不熟悉这种上下文中的 using 块。它如何用于非托管资源?
  • @healix 查看 asnwer 中using 语句的链接(我将using 字设为链接)。 非托管资源是指不受 CLR(.NET 运行时)控制的任何东西。 StreamReader 类有一些非托管资源(文件句柄)。调用Close 实际上会释放这些资源,但使用using 会更安全。只需谷歌“c# using 语句”。
【解决方案2】:

http://msdn.microsoft.com/en-us/library/2s05feca.aspx

引用:

“在你可以使用jaggedArray之前,它的元素必须被初始化。你可以像这样初始化元素:

jaggedArray[0] = new int[5];

jaggedArray[1] = new int[4];

jaggedArray[2] = new int[2];"

所以,您在代码中所做的是初始化一个由三个 int[] 组成的锯齿状数组,这些数组都设置为 null。如果在尝试分配给它之前没有在每个索引处创建数组,那么什么都没有。

不过,您似乎想要的是动态分配——您在编写程序时不知道需要存储多少个整数。在这种情况下,您应该了解 List&lt;&gt; 类。 List&lt;&gt; 就像一个数组,除了你可以在运行时添加和删除它的元素数量,而不是使用AddRemove 声明它具有固定大小。 http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

【讨论】:

  • 我知道 List,但我试图看看这是否可以使用锯齿状数组,因为我从未使用过它们
  • @healix 如果您可以提前将其元素数量初始化为您需要的确切数量,则可以使用锯齿状数组。如果这不能描述您的用例,请使用列表。
  • 那么锯齿状数组总是需要知道大小?不能动态分配?
  • @healix 您可以使用变量的内容对其进行初始化,例如jaggedArray[0] = new int[numberOfElements];,但除非您通读文件,否则请决定您将从其中创建多少条目,然后再次通读该文件初始化锯齿状数组后,没有用。
  • 谢谢。真的很感激。锯齿状的阵列让我发疯。
猜你喜欢
  • 2020-10-31
  • 2018-09-15
  • 2012-11-27
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多