Инициализация массива с зазубринами в C # из файла XML. Следующий код, кажется, работает для создания структуры данных, которую я хочу, исходя из того, что я вижу в отладчике, но код возвращает значение типа IEnumerable.

var ia = (from e in XDocument.Load("Test.xml").Descendants("doc")
          select (
              from rows in e.Elements("rows")
              select (
                  from cols in rows.Elements("cols")
                  select int.Parse(cols.Value)
              ).ToArray()
          ).ToArray());

Если я добавлю лишний .ToArray() в конце (благодаря другим статьям StackOverflow), я верну int[1][][].

Есть идеи, как заставить код работать, чтобы я мог просто написать int[][] array = (from e in... и т. Д.?

1
Adam Mac 9 Янв 2014 в 04:32

2 ответа

Лучший ответ

Если всегда есть только один элемент doc, вы можете сделать следующее:

var ia = (from e in XDocument.Load("Test.xml").Descendants("doc")
          select (
              from rows in e.Elements("rows")
              select (
                  from cols in rows.Elements("cols")
                  select int.Parse(cols.Value)
              ).ToArray()
          ).First().ToArray());

Если вы ожидаете более одного элемента doc, вы можете сделать дополнительный вызов SelectMany:

var ia = (from e in XDocument.Load("Test.xml").Descendants("doc")
          select (
              from rows in e.Elements("rows")
              select (
                  from cols in rows.Elements("cols")
                  select int.Parse(cols.Value)
              ).ToArray()
          ).SelectMany(x => x).ToArray());
1
MarcinJuraszek 9 Янв 2014 в 00:39

У вас есть потомки * строки * столбцы. Это 3D, а вам нужно 2D. Я думаю, вы ожидаете, что в вашем xml-файле будет только один потомок "doc". Вы можете проверить это с помощью Single, который не работает, когда в коллекции более одного элемента, то есть более одного "документа":

var ia = (from e in XDocument.Load("Test.xml").Descendants("doc")
    select (
        from rows in e.Elements("rows")
        select (
            from cols in rows.Elements("cols")
            select int.Parse(cols.Value)).ToArray()).Single().ToArray());
0
i3arnon 9 Янв 2014 в 00:49