c#中未知大小的数组

时间:2013-12-18 21:11:39

标签: c# arrays

我正在用C#编程,我想定义一个我不知道它的大小的数组,因为我想从文件中读取一些东西而我不知道该文件中的元素数量。这是我的代码,我有“x”数组的问题!

using (TextReader reader = File.OpenText("Numbers.txt"))
{
    string[] bits;
    string text = reader.ReadLine();
    int i ,j=0;
    int [] x;
    while (text != null)
    {
        i = 0;
        bits = text.Split(' ');

        while (bits[i] != null)
        {
            x[j] = int.Parse(bits[i]);
            i++;
            j++;
        }

        text = reader.ReadLine();
    }

}

然后我会得到这个错误 “使用未分配的局部变量'x'” 我不知道该怎么办!!请帮帮我......

5 个答案:

答案 0 :(得分:7)

您收到该错误是因为您没有初始化变量(除非您知道将存储在其中的项目数量,否则您无法真正执行此操作)。

由于您不知道项目数,因此您应该使用List代替,可以根据项目数量动态扩展:

using (TextReader reader = File.OpenText("Numbers.txt"))
{
   string[] bits;
   string text = reader.ReadLine();
   int i;
   IList<int> x = new List<int>();
   while (text != null)
   {
      i = 0;
      bits = text.Split(' ');

      while (bits[i] != null)
      {
         x.Add(int.Parse(bits[i]));
         i++;
      }
      text = reader.ReadLine();
   }
}

答案 1 :(得分:1)

对于甜蜜的单行:

int[] x = File
    .ReadAllLines("Numbers.txt")
    .SelectMany(s => s.Split(' ').Select(int.Parse))
    .ToArray();

对于较低的内存占用率,请考虑以下替代方法:

public static IEnumerable<int> ReadNumbers()
{
    using (var reader = new StreamReader(File.OpenRead("Numbers.txt."))) {
        string line;
        while ((line = reader.ReadLine()) != null) {
            foreach (var number in line.Split(' ')) {
                yield return int.Parse(number);
            }
        }
    }
}

请注意,每次迭代ReadNumbers的结果时,都会读取该文件。除非数字文件非常大,否则第一个解决方案就更优越了。

答案 2 :(得分:0)

问题出在这一行:

int [] x;

为什么不制作简单的清单?

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

您可以添加以下内容:

myIntList.Add(1);

然后像这样迭代它:

foreach(int item in myIntList)
{
    Console.WriteLine(item);
}

答案 3 :(得分:0)

正如其他人所说,你需要使用一个列表。但是,除了已经说过的内容之外,您还应该将IO错误和错误数据作为最佳实践处理。对于你正在做的事情,这可能有点过分,但最好养成这种习惯。

try
{
    List<int> x = new List<int>();
    using (TextReader reader = File.OpenText("Numbers.txt"))
    {
        string text;
        while ((text = reader.ReadLine()) != null)
        {
            string[] bits = text.Split(' ');
            foreach (string bit in bits)
            {
                // If you're parsing a huge file and it happens to have a
                // decent bit of bad data, TryParse is much faster
                int tmp;
                if(int.TryParse(bit, out tmp))
                    x.Add(tmp);
                else
                {
                    // Handle bad data
                }
            }
        }
    }
}
catch (Exception ex)
{
    // Log/handle bad text file or IO
}

答案 4 :(得分:0)

这里已有一些好的答案,但只是为了好玩:

using (var reader = File.OpenText("Numbers.txt"))
{
    var x = new List<int>();
    var text = reader.ReadLine();
    while (text != null)
    {
        x.AddRange(text.Split(' ').Select(int.Parse));
        text = reader.ReadLine();
    }
}