Как проецировать новый тип из иерархической структуры данных с помощью linq - PullRequest
0 голосов
/ 22 февраля 2010

У нас есть класс с именем Group, он содержит набор вопросов и , он также содержит набор групп (т. Е. У нас есть потенциальное вложение групп).

В XML это может выглядеть примерно так:

<group id="Group1">
  <questions>
      <question id="questions11"/>
  </questions>
  <groups>
    <group id="group12">
      <questions>
          <question id="question121"/>
      </questions>
      <groups>
        <group id ="group121">
          <questions>
             <question id="question1211"/>
          </questions>
        </group>
        <group id ="group122">
          <questions>
            <question id="question1221"/>
          </questions>
        </group>        
      </groups>
    </group>
    <group id="group13">
      <questions>
          <question id="question131"/>
      </questions>
    </group>
  </groups>
</group>

Я фактически упростил структуру, для краткости я опустил в каждую группу набор свойств, которые я хочу включить в проекцию.

То, что я хочу сделать, это сформировать новый тип, который включает здесь иерархическую структуру и некоторые свойства, но исключает некоторые другие и вопросы.

Я застрял на hwo, чтобы сделать это в linq. Я взглянул на SelectMany, но это было не то, что я хотел.

ТИА

Ответы [ 2 ]

0 голосов
/ 08 марта 2010

Хорошо ... Я не уверен, с какими объектами вы будете работать, но если бы он был из xml, вы можете попробовать что-то похожее на это:

    public class Group
    {
        public string Id { get; set; }
        IEnumerable<Question> Questions { get; set; }
        IEnumerable<Group> Groups { get; set; }

        public static IEnumerable<Group> Extract(XElement groupElement)
        {
            var groups = new List<Group>();
            var group = new Group{ Id = groupElement.Attribute("id").Value};
            groups.Add(group);

            // Extract questions.
            var questionsSubRoot = groupElement.Element("questions");
            if (questionsSubRoot != null)
                group.Questions = Question.Extract(questionsSubRoot);

            // Extract subgroups.
            var groupsElement = groupElement.Element("groups");
            if (groupsElement != null)
                group.Groups = groupsElement.Elements("group").SelectMany(elem => Group.Extract(elem));

            return groups;
        }
    }

и для вашего класса вопросов ...

    public class Question
    {
        public string Id { get; set; }

        public static IEnumerable<Question> Extract(XElement questionsElement)
        {
            return questionsElement.Elements().Select(elem => new Question { Id = elem.Attribute("id").Value });
        }
    }

Вы бы назвали это как ...

var xDoc = XDocument.Parse(xml);
var groups = Group.Extract(xDoc.Element("group"));
0 голосов
/ 22 февраля 2010

Вам потребуется создать рекурсивную функцию, которая превращает элемент <group> в экземпляр Group и вызывает себя для дочерних элементов <group>.

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