单行写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()
.
有没有办法在一行中编写以下内容,只有在 "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()
.