单行写if条件

Write if condition in single line

有没有办法在一行中编写以下内容,只有在 "InvoiceSum" 字段存在时才执行求和函数(并且不必重复 InvoiceSum 字段)?

If (Doc.MailMerge.GetFieldNames().ToList.Exists(Function(x) x = "InvoiceSum")) Then
  Doc.MailMerge.Execute({"InvoiceSum"}, {GetInvoiceSum()})
End If

想法是仅在 InvoiceSum 作为文档中的一个字段存在的情况下才执行邮件合并,因为 GetInvoiceSum 函数可能非常昂贵。

我想避免必须将每个合并字段包装在 if 条件中,这会污染代码,而且容易出错,因为您必须编写 "InvoiceSum" 两次。

如果您多次执行此操作,则可以存储 Doc.MailMerge.GetFieldNames() 的结果,而不是每次都调用它。

根据我找到的文档,Doc.MailMerge.GetFieldNames() returns 一个字符串数组。如果是这样,试试这个:

Dim FieldNames As String() = Doc.MailMerge.GetFieldNames()
If FieldNames.Contains("InvoiceSum") Then Doc.MailMerge.Execute({"InvoiceSum"}, {GetInvoiceSum()})

或者如果你想创建一个方法,试试这个:

Private Sub MergeIfExists(FieldName As String, FieldNames As String(), Action As Action)
    If FieldNames.Contains(FieldName) Then Doc.MailMerge.Execute({FieldName}, {Action})
End Sub

用法:

Dim FieldNames As String() = Doc.MailMerge.GetFieldNames()
MergeIfExists("InvoiceSum", FieldNames, AddressOf GetInvoiceSum)

也许最好也将 Doc 传递给该方法,但我不确定类型,所以将其留给您。

如果您对不同的字段有不同的功能,您可能想尝试使用字典将字段指向相应的功能。然后您可以根据是否将 MailMerge 字段作为键来过滤字典。然后你只执行过滤字段的功能。

' build your dictionary of [fieldname, function] somehow
Dim fieldsAndFunctions As New Dictionary(Of String, Func(Of Object))()
fieldsAndFunctions.Add("InvoiceSum", AddressOf GetInvoiceSum)
fieldsAndFunctions.Add("InvoiceAvg", AddressOf GetInvoiceAvg)
fieldsAndFunctions.Add("InvoiceMax", AddressOf GetInvoiceMax)

' get the field names once
Dim existingFields = doc.MailMerge.GetFieldNames()

' filter your dictionary down to only the items whose field names are in your MailMerge object
Dim filteredFieldsAndFunctions = fieldsAndFunctions.
    Where(Function(kvp) existingFields.Contains(kvp.Key))

' call execute, passing the fields and values as arrays
If filteredFieldsAndFunctions.Any() Then
    doc.MailMerge.Execute(
        filteredFieldsAndFunctions.Select(Function(f) f.Key).ToArray(),
        filteredFieldsAndFunctions.Select(Function(f) f.Value()).ToArray())
End If

仅针对存在的字段在末尾计算值。注意 () shorthand 代表 Func.Invoke().