Сопоставить иерархическую коллекцию объектов домена с иерархической коллекцией моделей представления - PullRequest
1 голос
/ 10 марта 2011

Я пытаюсь придумать эффективный подход к итерации иерархической коллекции объектов домена и сопоставить их с соответствующими им моделями представления.

Предположим, что у меня есть следующие два типа объектов домена:

(1) Папка - у этого объекта есть две коллекции - одна коллекция объектов папок и одна коллекция объектов Item.

(2) Item

Теперь у меня есть два класса модели представления - один для объекта домена Folder и один для объекта Item. Я хочу иметь возможность эффективно выполнять итерацию по всей моей иерархической коллекции, и на основе того, является ли объект папкой или элементом, я создам новый класс модели представления для соответствующего объекта домена и передам объект в конструктор модели представления. По сути, я хочу получить представление модели иерархического представления коллекции объектов иерархического домена. Я знаю, что могу сделать это с некоторыми вложенными для каждого, но я подумал, что кто-то может знать, как использовать методы расширения, linq и lambda.

Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Я думаю, вы ищете что-то вроде этого:

public class FolderVM
{
  public string Name {get; private set;}      

  public IEnumerable<FolderVM> Folders { get; private set; }
  public IEnumerable<ItemVM> Items { get; private set; }

  public FolderVM(Folder folder)
  {
    Name = folder.Name;

    Folders = folder.ChildFolders.Select(f=> new FolderVM(f));
    Items = folder.Items.Select(i=> new ItemVM(i));
  }
}

И рендеринг, вероятно, будет рекурсивным соответственно.

0 голосов
/ 10 марта 2011

Вы можете использовать такой запрос LINQ для объединения двух коллекций:

public class Folder
{
}

public class Item
{
}

public IEnumerable<Object> GetChildren()
{

    Folder[] Folders = new Folder[] { };
    Item[] Items = new Item[] { };

    return ((IEnumerable<Object>)(from Folder folder in Folders 
                                  select folder))
                                  .Union<Object>(
           (IEnumerable<Object>)(from Item item in Items select item));
}

если у вас есть общий базовый класс, его лучше использовать вместо "Object"

...