c# - 对每个 C 中的每个 B 执行操作 A ...如果 D 在树中
问题描述
我正在尝试创建一个对特定元素执行给定任务的抽象类。共享逻辑的两个示例:
示例 A
foreach (DraftDocument draft in drafts)
foreach (Sheet sheet in draft.Sheets)
foreach (Symbol symbol in sheet.Symbols)
if(conditions) do action
示例 B
foreach (DraftDocument draft in drafts)
foreach (Sheet sheet in draft.Sheets)
foreach (View view in sheet.Views)
if(conditions) do action
我想重用foreach
逻辑,并创建一个同时采用条件方法和操作方法的函数,并在给定的数据集(在本例中为 DraftDocuments 列表)上执行它。
什么是创造这样的好方法?我读了一些关于 Func 委托的内容,但我不确定如何正确实现它。
解决方案
你可以做类似的事情
public class DocumentVisitor
{
private readonly IEnumerable<DraftDocument> _drafts;
private void Visit(Action<Sheet> visitor)
{
foreach(DraftDocument draft in _drafts)
foreach(Sheet sheet in draft.Sheets)
visitor(sheet);
}
public DocumentVisitor(IEnumerable<DraftDocument> drafts) => _drafts = drafts;
public void VisitSymbols(Action<Symbol> visitor) =>
Visit(sheet =>
{
foreach(Symbol symbol in sheet.Symbols)
visitor(symbol);
});
public void VisitViews(Action<View> visitor) =>
Visit(sheet=>
{
foreach(View view in sheet.Views)
visitor(view);
});
}
推荐阅读
- python - 合并字典中的列表并删除重复项
- php - 如何在 Myth/Auth 库 Code Igniter 4 中获取用于登录的当前电子邮件
- mysql - 如何使用现有卷(mariadb)重新启动 docker-compose
- spring-cloud-sleuth - 带有 spring-cloud-sleuth-otel 的 Spring 5 MVC
- spring - 在 Spring Boot 应用程序中定位未映射的类错误
- mysql - 将 OQMD 数据库转换为 ase db
- python - 用python在excel中移动数据
- reactjs - 如何更改基于本机的单选按钮的非活动背景颜色,而不是在本机反应中没有颜色
- javascript - Vue().$mount() 的 Angular 等价物
- flutter - DIO 多请求 IOS 设备不执行