如何在 lambda 表达式中使用数组?

How to use arrays in lambda expressions?

我正在用 ElasticSearch 的 NEST 库编写程序。我想用这个参数为函数编写一个 lambda 表达式:

HighlighDescriptor<parentdocument> HighlighDescriptor.onFields
    (param Action<HighlightFieldDescriptor<ParentDocument>>[] fieldHighlighters)

不知道函数参数中的数组是什么?

C#中的params关键字表示该方法采用可变数量的参数。例如,具有此签名的方法:

public void DoStuff(params string[] values) { ... }

可以这样称呼:

DoStuff();
DoStuff("value1");
DoStuff("value1", "value2", "value3", "value4", "value5");
//etc.

因此,在您的情况下,该数组供您指定任意数量的 Action 值。一个例子是:

blah.OnFields(
    f => f.OnField("field1").PreTags("<span>").PostTags("</span>"),
    f => f.OnField("field2").PreTags("<span>").PostTags("</span>"),
    f => f.OnField("field3").PreTags("<span>").PostTags("</span>")
);

我们来看看参数的类型:

params Action<highlightfielddescriptor<parentdocument>> []

注意 params 关键字,它告诉编译器关联的方法可以采用 变量 个参数。这意味着您可以传入多个 Action<highlightfielddescriptor<parentdocument>> 个对象。

根据MSDN

[...] The Action Delegate encapsulates a method that has a single parameter and does not return a value

Action 中,这个“单个参数”是 Action 的通用类型参数的类型。在您的情况下,此单个参数的类型为 <highlightfielddescriptor<parentdocument>>

在 C# 中,您可以使用以下语法表达 lambda 表达式:

(parameters) => (body)

考虑到这一点,Action<highlightfielddescriptor<parentdocument>> 可以翻译成这样:

Action<highlightfielddescriptor<parentdocument>> action = (fieldDescriptor) => {
   //... Your code here
};

fieldDescriptor 是一个局部变量(highlightfielddescriptor<parentdocument> 类型),它将持有一个由 onFields 方法

委托给你的实例

现在你可以这样调用方法了:

var descriptor = HighlighDescriptor.onFields((fieldDescriptor) => {
      //Your code here...
});

甚至像这样:

var descriptor = HighlighDescriptor.onFields((f) => {
       //Do something
}, (f) => {
       //Do something else
}, (f) => {
       //An action can also have an empty body
});

注意多个动作。

PS:记住 Action 委托不能 return 值!

此表达式无效 Action 委托:

(value) => {
    DoSomething(value);
    return value; //WRONG!
}