Ошибка при разборе текстового файла - PullRequest
1 голос
/ 18 апреля 2011

Ребята, у меня ошибка с моим кодом, и я не понимаю почему, вот мой код:

private void Parsing_String(string filename)
    {
        int outValue;
        int[][] number = new int[26][];
        List<Row> list = new List<Row>(); 

        //StreamReader freader = File.OpenText(filename);

        var parsed = File.ReadLines(filename)
            .Select(line => line.Split(' ')
                .Where(IsInteger)
                .Select(s => int.Parse(s))
                .ToArray())
            .ToArray();

        foreach (String str in File.ReadLines(filename))
        {
            String[] strCols = str.Split(' ');

            /*for (int i = 0; i < 26; i++)
            {
                number[i] = new int[strCols.Length];
                for (int j = 0; j < strCols.Length; j++)
                {
                    number[i][j] = int.TryParse(strCols[j].Substring(2), out outValue) ? outValue : 0;
                    listBox2.Items.Add(number[i][j]);
                }
            }*/


            list.Add(new Row()
            {
                Column1 = int.TryParse(strCols[0].Substring(2), out outValue) ? outValue : 0,
                Column2 = int.TryParse(strCols[1].Substring(2), out outValue) ? outValue : 0,
                Column3 = int.TryParse(strCols[2].Substring(2), out outValue) ? outValue : 0,
                Column4 = int.TryParse(strCols[3].Substring(2), out outValue) ? outValue : 0,
                Column5 = int.TryParse(strCols[4].Substring(2), out outValue) ? outValue : 0,
                Column6 = int.TryParse(strCols[5].Substring(2), out outValue) ? outValue : 0,
            });

        }

        dg.ItemsSource = list;


        label3.Content = number[1][0];
        label4.Content = number[0][1];
        int kali = number[0][0] * number[0][1];
        label2.Content = kali;
    }

    static bool IsInteger(string possibleInt)
    {
        int k;
        return int.TryParse(possibleInt, out k) ? k : 0;        
    }


    public class Row
    {
        public int Column1 { get; set; }
        public int Column2 { get; set; }
        public int Column3 { get; set; }
        public int Column4 { get; set; }
        public int Column5 { get; set; }
        public int Column6 { get; set; }
    }

    #endregion


}

} // Здесь образец текстового файла 10192 20351 30473 40499 50449 60234 10192 20207 30206 40203 50205 60226 10192 20252 30312 40376 50334 60252 10192 20271 30332 40405 50209 60234

Может кто-нибудь показать мне, что я делаю не так?

что я хочу сделать, так это то, что у меня есть текстовый файл, содержащий число, я хочу проанализировать его и поместить каждое число в массив, чтобы я мог легко получить к нему доступ. Достаточно ли эффективен мой код?

спасибо, много за предложение.

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

Кажется, ваша главная ошибка такова:

int[][] number = new int[26][];

это только создание экземпляра массива массивов, а не самих вложенных массивов, поэтому, когда вы пишете

number[i][j] = ...

number[i] возвращает значение NULL, а вызов индексатора для NULL является исключением NullReferenceException!

Edit:
Что вы должны написать это:

for (int i = 0; i < 26; i++)
{
  number[i] = new int[strCols.Length];
  for (int j = 0; j < strCols.Length; j++)
  {
      //...
  }
}
1 голос
/ 18 апреля 2011

На мой взгляд, это проще без инициализации массива (пропустите этот ответ, если вы делаете это в качестве упражнения для использования массивов в C #).

var parsed = File.ReadLines("SO.txt")
                 .Select(line => line.Split(' ') 
                                     .Select(MyIntegerParse)  // pick out each item as an int
                                     .ToArray())  // get array of ints 
                 .ToArray();  // return as int[][]


....

static int MyIntegerParse(string possibleInt)
{
     int i;
     return int.TryParse(possibleInt, out i) ? i : 0;
}
...