递归列表展平

2023-11-21

我可能可以自己写这个,但我试图完成它的具体方式让我失望。我正在尝试编写一种类似于 .NET 3.5 中引入的其他方法的通用扩展方法,该方法将采用 IEnumerable 的嵌套 IEnumerable(等等)并将其展平为一个 IEnumerable。有人有主意吗?

具体来说,我在扩展方法本身的语法方面遇到了麻烦,因此我可以研究扁平化算法。


这是一个可能有帮助的扩展。它将遍历对象层次结构中的所有节点,并挑选出符合条件的节点。它假设层次结构中的每个对象具有集合属性持有其子对象。

这是扩展:

/// Traverses an object hierarchy and return a flattened list of elements
/// based on a predicate.
/// 
/// TSource: The type of object in your collection.</typeparam>
/// source: The collection of your topmost TSource objects.</param>
/// selectorFunction: A predicate for choosing the objects you want.
/// getChildrenFunction: A function that fetches the child collection from an object.
/// returns: A flattened list of objects which meet the criteria in selectorFunction.
public static IEnumerable<TSource> Map<TSource>(
  this IEnumerable<TSource> source,
  Func<TSource, bool> selectorFunction,
  Func<TSource, IEnumerable<TSource>> getChildrenFunction)
{
  // Add what we have to the stack
  var flattenedList = source.Where(selectorFunction);

  // Go through the input enumerable looking for children,
  // and add those if we have them
  foreach (TSource element in source)
  {
    flattenedList = flattenedList.Concat(
      getChildrenFunction(element).Map(selectorFunction,
                                       getChildrenFunction)
    );
  }
  return flattenedList;
}

示例(单元测试):

首先我们需要一个对象和一个嵌套对象层次结构。

一个简单的节点类

class Node
{
  public int NodeId { get; set; }
  public int LevelId { get; set; }
  public IEnumerable<Node> Children { get; set; }

  public override string ToString()
  {
    return String.Format("Node {0}, Level {1}", this.NodeId, this.LevelId);
  }
}

以及获得 3 级深层节点层次结构的方法

private IEnumerable<Node> GetNodes()
{
  // Create a 3-level deep hierarchy of nodes
  Node[] nodes = new Node[]
    {
      new Node 
      { 
        NodeId = 1, 
        LevelId = 1, 
        Children = new Node[]
        {
          new Node { NodeId = 2, LevelId = 2, Children = new Node[] {} },
          new Node
          {
            NodeId = 3,
            LevelId = 2,
            Children = new Node[]
            {
              new Node { NodeId = 4, LevelId = 3, Children = new Node[] {} },
              new Node { NodeId = 5, LevelId = 3, Children = new Node[] {} }
            }
          }
        }
      },
      new Node { NodeId = 6, LevelId = 1, Children = new Node[] {} }
    };
  return nodes;
}

第一个测试:扁平化层次结构,不进行过滤

[Test]
public void Flatten_Nested_Heirachy()
{
  IEnumerable<Node> nodes = GetNodes();
  var flattenedNodes = nodes.Map(
    p => true, 
    (Node n) => { return n.Children; }
  );
  foreach (Node flatNode in flattenedNodes)
  {
    Console.WriteLine(flatNode.ToString());
  }

  // Make sure we only end up with 6 nodes
  Assert.AreEqual(6, flattenedNodes.Count());
}

这将显示:

Node 1, Level 1
Node 6, Level 1
Node 2, Level 2
Node 3, Level 2
Node 4, Level 3
Node 5, Level 3

第二个测试:获取具有偶数 NodeId 的节点列表

[Test]
public void Only_Return_Nodes_With_Even_Numbered_Node_IDs()
{
  IEnumerable<Node> nodes = GetNodes();
  var flattenedNodes = nodes.Map(
    p => (p.NodeId % 2) == 0, 
    (Node n) => { return n.Children; }
  );
  foreach (Node flatNode in flattenedNodes)
  {
    Console.WriteLine(flatNode.ToString());
  }
  // Make sure we only end up with 3 nodes
  Assert.AreEqual(3, flattenedNodes.Count());
}

这将显示:

Node 6, Level 1
Node 2, Level 2
Node 4, Level 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归列表展平 的相关文章

  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 如何将 PostgreSql 与 EntityFramework 6.0.2 集成? [复制]

    这个问题在这里已经有答案了 我收到以下错误 实体框架提供程序类型的 实例 成员 Npgsql NpgsqlServices Npgsql 版本 2 0 14 2 文化 中性 PublicKeyToken 5d8b90d52f46fda7 没
  • 当我使用 OpenSSL1.1.0g 根据固定的 p 和 g 值创建 Diffie Hellman 密钥协议密钥时,应该执行哪些检查?

    您好 我尝试通过这段代码使用修复 p 和 g 参数来制作 Diffie Hellman Keysanswer https stackoverflow com a 54538811 4706711 include

随机推荐

  • 为什么 geom_text() 多次绘制文本?

    请考虑以下最小示例 library ggplot2 library ggrepel ggplot mtcars aes x mpg y qsec geom line geom text x 20 y 20 label 20 20 我想您可以
  • 什么是严格类型语言? [复制]

    这个问题在这里已经有答案了 什么是严格类型语言 严格类型化语言强制对所有交互的数据进行类型化 例如 int i 3 string s 4 从现在开始 每当您使用 i 时 您只能将其作为整数类型进行交互 这意味着您只能使用处理整数的方法 至于
  • 正则表达式字符与 grep 一致重复 n 次或多次

    我需要找到正则表达式来查找使用 grep 重复 4 次或更多次的字符 我知道表达式是 n 所以如果我需要查找行 例如 当字符 g 重复 4 次或更多次时 理论上 grep 手册页是 grep g 4 textsamplefile 但不起作用
  • 是否可以通过文本装饰来制作 CSS 动画?

    我正在尝试使用CSS对一段文本进行动画处理 但它实际上并不是动画 只是从隐藏到显示 谁能告诉我我正在尝试的事情是否真的可行 如果没有 还有其他方法可以实现这一目标吗 HTML div The text in the span span cl
  • Linux x86_64汇编socket编程

    我正在学习汇编 按照我通常学习的任何新语言的步骤 我已经通过汇编实现了网络化 遗憾的是 进展并不顺利 因为我在第 0 步几乎失败了 这将获得一个可以开始通信的套接字 汇编代码应大致等于以下 C 代码 include
  • 为 Woocommerce 中的订单添加额外元数据

    我正在为我的网站创建一个自定义插件 在这个插件的某些部分我需要存储额外的元数据wp postmeta对于每个订单 我在我的插件类中添加了这个 add action woocommerce before checkout process ar
  • 是否可以在 Axios 中发布 responseType: 'stream' ?

    我正在尝试编辑 Axios 的实例 以便响应类型应该是 stream 而不是标准的 JSON 从 S O 上的其他帖子中我似乎不清楚 如何实现这一点 这是死路一条吗 我当前的 Axios 实例 import axios from axios
  • WidgetBundle 根据某些逻辑返回小部件

    我已经为我的应用程序准备了几个 iOS14 主屏幕小部件 并将它们全部返回WidgetBundle像这样 main struct WidgetsBudle WidgetBundle WidgetBundleBuilder var body
  • 辅助功能服务 - PerformGlobalAction() 返回 false

    我正在创建一个Android无障碍服务哪个调用执行全局动作 at onStartCommand public int onStartCommand Intent intent int flags int startId Log d serv
  • Git-Tfs:每个 Git 提交都有一个 TFS 变更集?

    在工作中 我们使用 TFS 我正在尝试让 Git TFS 工具正常工作 以便在将本地提交推送到我们的 TFS 存储库之前在处理本地提交时拥有更大的灵活性 我有这个工作 但是当我做一个git tfs ct 它将我的所有提交检查到一个 TFS
  • CSS 网格中的等宽列

    我想让下面的 html 在 n 个相等的列中显示 使用 css 网格的行元素是否有两个 三个或更多子元素 Flexbox 使这很容易 但我无法使用 css 网格完成它 任何帮助受到赞赏 div class row div class ite
  • 有没有办法在 iOS 7 中禁用键盘的透明度?

    我想要一个带有不透明键盘的键盘 我无法使用任何受支持的 UIKeyboardTypes 获得此键盘 还有其他办法解决这个问题吗 我想我可以用我想要的颜色覆盖键盘下的背景视图 有没有一种好的方法可以使背景视图与键盘显示动画同步 当使用 iOS
  • 使用 stat_summary 用观察数来注释绘图

    我该如何使用stat summary标记一个图n x哪里x一个变量 这是所需输出的示例 我可以用这个相当低效的代码来制作上面的图 nlabels lt sapply 1 length unique mtcars cyl function i
  • Mercurial 如何处理分割的文件?

    Mercurial 如何处理分割的文件 如果我创建一个分支并拆分一个文件会发生什么 我可以轻松地从修改原始未分割文件的另一个分支中提取更改吗 我只是做了一个小实验 我创建了一个存储库 foo 与一个大文件 然后我将其克隆到bar used
  • JSF 在 SVG 之后吞掉结束标签

    我用的是两个
  • 停止 MySQL 在 UNIQUE 约束中容忍多个 NULL

    Mysql 架构是 CREATE TABLE Foo bar INT NULL name VARCHAR 59 NOT NULL UNIQUE name bar ENGINE INNODB MySQL 允许重复以下语句 从而导致重复 INS
  • 当方法仅在 return 语句处等待时,将方法标记为异步是否有用? [复制]

    这个问题在这里已经有答案了 只有下面方法的最后一行在方法返回之前使用了 await 所以这是否意味着该方法基本上是同步的 应该只调用 Get 而不使用 async 修饰符和后缀 Async public virtual async Task
  • malloc分配的对象的动态类型是什么?

    C 标准引用术语 动态类型 C 标准在类似上下文中引用 有效类型 例如 如果程序尝试通过访问对象的存储值glvalue除以下类型之一外 行为未定义 对象的动态类型 但是对象的动态类型是如何分配的malloc决定 例如 void p mall
  • Neo4j 中每个查询返回前 n 个结果

    我一直在尝试在密码查询中执行以下任务 但没有得到正确的结果 其他 stackoverflow 问题讨论了 limit 或collect 但我认为这不足以完成以下任务 任务 我有 p Product 节点 并且两个产品节点之间存在一种名为 B
  • 递归列表展平

    我可能可以自己写这个 但我试图完成它的具体方式让我失望 我正在尝试编写一种类似于 NET 3 5 中引入的其他方法的通用扩展方法 该方法将采用 IEnumerable 的嵌套 IEnumerable 等等 并将其展平为一个 IEnumera