在树结构上实现 IEnumerable

2023-12-14

基于这些人的工作:

  • http://dvanderboom.wordpress.com/2008/03/15/treet-implementing-a-non-binary-tree-in-c/
  • http://www.matthidinger.com/archive/2009/02/08/asp.net-mvc-recursive-treeview-helper.aspx

我正在尝试实现一个 TreeView 助手,其用途如下:

<%= Html.TreeView("records", 
                  Library.Instance.Records, 
                  r => r.Children, 
                  r => r.ID) %>

树结构定义如下:

public class Tree<T> : TreeNode<T> where T : TreeNode<T>
{ }


public class TreeNode<T> : IDisposable where T : TreeNode<T>
{
    public T Parent { get; set; }
    public TreeNodeList<T> Children { get; set; }
}


public class TreeNodeList<T> : List<TreeNode<T>> where T : TreeNode<T>
{
    public T Parent;

    public T Add(T node)
    {
        base.Add(node);
        node.Parent = (T)Parent;
        return node;
    }

    public void Remove(T node)
    {
        if (node != null)
            node.Parent = null;
        base.Remove(node);
    }
}

TreeView 助手具有以下签名:

public static string TreeView<T>(this HtmlHelper htmlHelper, string treeId,
   IEnumerable<T> rootItems, Func<T, IEnumerable<T>> childrenProperty, 
   Func<T, string> itemContent, bool includeJavascript, string emptyContent)
{
    ...
}   

因此,我需要我的 Tree 结构来实现 IEnumerable,这样我就可以将它与 TreeView 助手一起使用,这就引出了一个问题:在这种情况下我将在哪里以及如何实现 IEnumerable?


我不完全理解树结构的确切细节,但这里有一个简单的实现,它采用通用的节点树并将其递归地呈现为 html 列表。

public static string TreeView<T>(IEnumerable<T> rootItems,
                                 Func<T, IEnumerable<T>> childrenProperty,
                                 Func<T, string> itemContent)
{
    if (rootItems == null || !rootItems.Any()) return null;

    var builder = new StringBuilder();
    builder.AppendLine("<ul>");

    foreach (var item in rootItems)
    {
        builder.Append("  <li>").Append(itemContent(item)).AppendLine("</li>");
        var childContent = htmlHelper.TreeView(treeId,
                                               childrenProperty(item),
                                               childrenProperty,
                                               itemContent);

        if (childContent != null)
        {
            var indented = childContent.Replace(Environment.NewLine,
                                                Environment.NewLine + "  ");
            builder.Append("  ").AppendLine(indented);
        }
    }

    builder.Append("</ul>");
    return builder.ToString();
}

我使用的节点类相对简单,只有两个属性。

public class Node<T>
{
    public Node(T data)
    {
        Data = data;
        Children = new List<Node<T>>();
    }

    public T Data { get; private set; }
    public ICollection<Node<T>> Children { get; private set; }
}

这是一些将树输出到控制台的测试代码。

var Records = new[] {
    new Node<string>("one") {
        Children = {
            new Node<string>("one-one") {
                Children = {
                    new Node<string>("one-one-one"),
                    new Node<string>("one-one-two"),
                    new Node<string>("one-one-three")
                }
            },
            new Node<string>("one-two"),
            new Node<string>("one-three")
        }
    },
    new Node<string>("two"),
    new Node<string>("three")
};
Console.WriteLine(TreeView(Records,
                           r => r.Children,
                           r => r.Data));

这是上面代码的结果。

<ul>
  <li>one</li>
  <ul>
    <li>one-one</li>
    <ul>
      <li>one-one-one</li>
      <li>one-one-two</li>
      <li>one-one-three</li>
    </ul>
    <li>one-two</li>
    <li>one-three</li>
  </ul>
  <li>two</li>
  <li>three</li>
</ul>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在树结构上实现 IEnumerable 的相关文章

随机推荐

  • 实体框架存储过程和 POCO

    我需要有关使用 Entity Framwork 4 x 存储过程将数据返回到 POCO 对象的建议 我不想将数据从实体对象复制到 POCO 对象 我想执行一个存储过程并将数据直接加载到我的 POCO 类中 有没有办法做到这一点 我是否需要像
  • Collections.sort(...) 是如何工作的?

    需要明确的是 我试图找出 Collections sort list new MyComp 方法如何按顺序调用比较方法 我有一个包含员工及其个人号码 k 的 LinkedList 数字是 1 2 3 4 5 6 MyComparator 中
  • Drupal 共享表,但来自另一个数据库

    我有一个包含数百个站点的 Drupal Multisite 我想共享一些表格 例如横幅和角色 这样我就不必在更改横幅时更新数百个站点 例如 我知道这可以使用 settings php 中的这些字符串来完成 db url mysql user
  • JTextArea 中特定文本的 ActionListener?

    我的应用程序中有一个聊天组件 其中有一个JTextArea在上面 现在 如何为特定文本 例如student xxxx 添加类似ActionListener 的事件 因此 当我单击该文本 student xxxx 时 就会发生一些事情 谢谢
  • Spring Boot 和 Spring Data:Hibernate 会话如何管理?

    我目前正在开发一个使用 Spring Boot 和 Spring Data 的应用程序 其JpaRepository接口 准确地说 是与 Hibernate 一起使用 我喜欢 Hiberante 的一件事是它的缓存功能 当您提交与特定对象匹
  • 调用 Web 浏览器上下文菜单

    我正在开发一个项目 一个 Web Bot 它使用 WebBrowser 控件 我的目标是以编程方式在加载的 Web 浏览器中的所需元素上打开 Web 浏览器上下文菜单 然后从上下文菜单中选择一个选项 Example 在 WebBrowser
  • 创建引用数组

    如果我有一个类 A 并且我将这个类的 10 个元素的数组声明为 A arr new A 10 然后A的10个新对象被创建并存储在数组中 但是 我希望能够做一些事情A arr 10 其中数组仅保存对空对象的引用 我需要这个的原因是因为我只需要
  • 快速算法实现对非常小的列表进行排序

    这是我很久以前遇到的问题 我想我可以问问你的想法 假设我有一个非常小的数字 整数 列表 4 或 8 个元素 需要快速排序 最好的方法 算法是什么 我的方法是使用最大 最小函数 10 个函数对 4 个数字进行排序 无分支 iirc s i j
  • 为什么使用 SetUnhandledExceptionFilter 时堆栈遍历无法正常工作?

    我使用以下代码在异常时遍历堆栈 note 您必须在发布版本中运行它 以便正确地将堆栈跟踪的所需输出接收到控制台 而不是在调试模式下运行 否则它只会显示弹出窗口 include stdafx h include
  • MPI - 工作/池示例

    有没有为 MPI 使用工作 池 或生产者 消费者 方案的示例 至于我所做的一切 我只得到一个正在通过的应用程序 然后我的应用程序陷入僵局 Thanks 只要在谷歌上搜索 MPI Master Worker 或 MPI Master Slav
  • AttributeError:QDialog对象没有属性setCentralWidget

    我正在尝试使用 QT Designer 创建 GUI 我已使用以下教程将 ui 设计器文件转换为 py 文件 http pyqt sourceforge net Docs PyQt5 designer html 我有以下代码 Created
  • 如何知道我的 WPF 应用程序可以播放哪些视频格式?

    我有一个允许播放视频的小应用程序 首先 我不限制用户选择特定类型的文件 我想要做的是确保我可以播放用户选择的文件 如何获取可用编解码器的列表 或查询 WPF 应用程序的播放质量 MediaElement控制 建议的替代方案是在播放之前将任何
  • 使用 Java 8 中的泛型方法对集合进行排序

    以下方法执行排序 public List
  • 每次需要重新绘制时,如何抓取 qwidget /将其渲染在像素图中?

    我有一个 QWidget 我不想在屏幕上显示 相反 我想在每次重新绘制小部件时获取该小部件的像素图 以便将其发送到我正在处理的应用程序的另一部分 API 提供了两种方法来执行此操作 QPixmap grabWidget and QWidge
  • 按关键字进行惯用的 clojure 映射查找

    假设我有一个使用关键字作为键的 clojure 映射 def my car color candy apple red horsepower 450 我知道我可以通过使用关键字或映射作为函数并将另一个作为其参数来查找与关键字关联的值 my
  • Delphi 2009 中的通用 TList<> 在 IndexOf 上崩溃

    我已经看到很多关于 Delphi 2009 泛型中错误的提及 但从未预料到如此基本的东西会在 Update 3 中失败 同样如此 如果列表包含 1 个或多个项目 则在通用 TList 或 TObjectList 上调用 IndexOf 会导
  • 将 R 中的矩阵顺时针旋转 90 度

    我在 R 中有一个这样的矩阵 1 2 3 1 2 3 1 2 3 有没有一种简单的方法可以将整个矩阵顺时针旋转 90 度以获得这些结果 1 1 1 2 2 2 3 3 3 再次旋转 90 度 3 2 1 3 2 1 3 2 1 t不旋转条目
  • EXCEPTION_ACCESS_VIOLATION 崩溃的可能原因是什么?

    当我使用 Eclipse 运行项目的 java bean 时 我收到此崩溃报告 我完全不知道它是什么以及如何调试 谁能告诉我调试这个的可能方法 An unexpected error has been detected by Java Ru
  • 在 .NET 运行时解析 JSON

    我想从 WebServer 得到一些响应 返回的数据如下所示 3014887 string1 string http num60 webservice com u3014887 b c9c0625b jpg 0 3061529 string
  • 在树结构上实现 IEnumerable

    基于这些人的工作 http dvanderboom wordpress com 2008 03 15 treet implementing a non binary tree in c http www matthidinger com a