【问题标题】:Map Hierarchical Collection of Domain Objects to Hierarchical Collection of ViewModels将领域对象的分层集合映射到 ViewModel 的分层集合
【发布时间】:2011-07-12 18:39:17
【问题描述】:

我正在尝试一种有效的方法来遍历域对象的分层集合并将它们映射到相应的视图模型。

假设我有以下两种类型的域对象:

(1) 文件夹 - 此对象有两个集合 - 一个文件夹对象集合和一个 Item 对象集合。

(2) 项

现在,我有两个视图模型类 - 一个用于文件夹域对象,一个用于 Item 对象。我希望能够有效地遍历我的整个分层集合,并且根据对象是文件夹还是项,我将为相应的域对象创建一个新的视图模型类,并将该对象传递给视图模型的构造函数。基本上,我想以分层域对象集合的分层视图模型表示结束。我知道我可以使用一些嵌套的 foreaches 来做到这一点,但我认为有人可能知道使用扩展方法、linq 和 lambda 的方法。

感谢您的帮助。

【问题讨论】:

  • 分层与递归很好地共鸣
  • 这里的“高效”是什么意思?你在优化你的表现吗?

标签: c# linq lambda extension-methods


【解决方案1】:

您可以使用这样的 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));
}

如果你有一个通用的基类,那么使用它而不是“对象”肯定会更好

【讨论】:

    【解决方案2】:

    我猜你正在寻找这样的东西:

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

    而且渲染可能会分别是递归的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多