理解Func委托(lambda表达式)的列表

本文关键字:列表 表达式 lambda Func 委托 理解 | 更新日期: 2023-09-27 18:12:42

我开始使用lambda表达式,现在我经常使用它,但只使用简单的表达式:-(。有时,我真的很难理解现有代码库中的lambda表达式。努力理解下面的代码,但仍然无法完全破译:-(.我认为由于使用了Func委托,我无法理解。我知道当委托返回一些东西时会使用Func委托。但在这种情况下没有线索。

代码片段:

 public class PrintProvider
 {
     private readonly IInstructionSheetViews _instructionSheetViews;
     public PrintProvider(IInstructionSheetViews instructionSheetViews)
     {
         _instructionSheetViews = instructionSheetViews;
     }
     public void AddReport()
     {
  // Some implementation code goes here
         var printViews = _instructionSheetViews.PrintViews;
  // Some implementation code goes here
     }
 }
public class InstructionSheetViews : IInstructionSheetViews
 {
     private readonly IInstructionSheetFactory _factory;
     private IEnumerable<IReport> _instructionSheetView;
     private List<Func<IInstructionSheetFactory, IReport>> _instructionSheetViewList;
    public InstructionSheetViews(IInstructionSheetFactory factory)
     {
         _factory = factory;
     }
    public IEnumerable<IReport> PrintViews
     {
         get
         {
             if (_instructionSheetView == null)
             {
                 Init();
                 _instructionSheetView = _instructionSheetViewList.Select(x => x(_factory));
             }
            return _instructionSheetView;
         }
     }
    private void Init()
     {
          _instructionSheetViewList = new List<Func<IInstructionSheetFactory, IReport>>();
         _instructionSheetViewList.Add(x => x.BuildCommonData());
         _instructionSheetViewList.Add(x => x.BuildSpecificData());
     }
 }

在上面的代码片段中,AddReport方法调用"_instructionSheetViews.PrintViews",而此方法inturn调用"Init(("。

Q1.这里的"_instructionSheetViewList"中到底添加了什么-

    _instructionSheetViewList.Add(x => x.BuildCommonData());. 

我可以猜测的是,它添加了一个返回"IReport"的方法。但是"_instructionSheetViewList"包含一个"Func"列表。那么,理想情况下,它不应该包含一个将输入作为"IInstructionSheetFactory"并返回"IReport"的方法吗?

Q2.这种说法是如何运作的。基本上是控制流程。

_instructionSheetViewList.Select(x => x(_factory));

有人能给我解释一下吗?

提前谢谢。

理解Func委托(lambda表达式)的列表

那么,理想情况下,它不应该包含一个将输入作为"IInstructionSheetFactory"并返回"IReport"的方法吗?

确实如此。_instructionSheetViewList.Add(x => x.BuildCommonData());基本上等同于:

 _instructionSheetViewList.Add(anonymousMethod12345);
/*...*/
public static IReport anonymousMethod12345 (IInstructionSheetFactory x)
{
    return x.BuildCommonData();
}
 _instructionSheetViewList.Add(x => x.BuildCommonData());

相当于-

private IReport GetReport(IInstructionSheetFactory x)
    {
        return x.BuildCommonData();
    }

当你这样做的时候-

_instructionSheetViewList.Select(x => x(_factory)); 

它实际上调用了一个将Func作为该方法输入参数的方法inturn调用Func委托引用的方法,并将_factory作为输入参数

private IReport DoSomething(Func<IInstructionSheetFactory, IReport> x)
    {
        return x(_factory);
    }

希望这能有所帮助。