如何在 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!
}
我正在用 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!
}