首页 > 解决方案 > 对每个 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 委托的内容,但我不确定如何正确实现它。

标签: c#abstract-classfunc

解决方案


你可以做类似的事情

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

}


推荐阅读