Преобразовать IEnumerable<int[][]> в int[][]

Инициализация зубчатого массива в 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() в конце (благодаря другим статьям Stackru) я возвращаюсь int[1][][],

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

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());

У вас есть потомки * строки * столбцы. Это 3D, и вы хотите 2D. Я предполагаю, что вы ожидаете только одного потомка "doc" в вашем XML-файле. Вы можете проверить это с 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());
Другие вопросы по тегам