【发布时间】:2022-11-03 18:47:21
【问题描述】:
我有一个函数,我想向其传递任意数量的成对参数(即String 变量和第二个任意类型(可能是String、Integer 等) - 因此我声明了这对是Object。可能有一对或多对这种性质。
因此,我能想到的最明显的结构是Tuple(Of String, Object)
这是功能:
Private Function TableLookup(
table As DataTable,
ByVal columnNamesAndKeys As List(Of Tuple(Of String, Object)),
resultColumnName As String) As Object
Dim filterExpression As String = ""
For i = 0 To columnNamesAndKeys.Count
Dim lookupColumn As String = columnNamesAndKeys(i).Item1
Dim lookupKey As Object = columnNamesAndKeys(i).Item2
Dim keyType = lookupKey.GetType()
If keyType IsNot table.Columns(lookupColumn).DataType Then Return Nothing
If keyType Is GetType(String) Then
filterExpression += IIf(Len(filterExpression) > 0, " AND ", "") + $"{lookupColumn} = '{lookupKey}'"
ElseIf keyType Is GetType(Date) Then
filterExpression += IIf(Len(filterExpression) > 0, " AND ", "") + $"{lookupColumn} = #{lookupKey:M/dd/yyyy h:mm:ss tt}#"
Else
filterExpression += IIf(Len(filterExpression) > 0, " AND ", "") + $"{lookupColumn} = {lookupKey}"
End If
Next
Dim row = table.Select(filterExpression).FirstOrDefault()
Return If(row Is Nothing, Nothing, row(resultColumnName))
End Function
如此调用(对于单对):
Dim someKey As Integer
Dim someValue = TableLookup(
dtbSomeTable,
New List(Of Tuple(Of String, Object))
From {("SomeKey", DirectCast(someKey, Object)).ToTuple},
"SomeOtherColumn")
因此(对于多对):
Dim someKey As Integer
Dim someOtherKey As String
Dim someValue = TableLookup(
dtbSomeTable,
New List(Of Tuple(Of String, Object))
From {("SomeKey", DirectCast(someKey, Object)).ToTuple,
("SomeOtherKey", DirectCast(someOtherKey, Object)).ToTuple},
"SomeOtherColumn")
所以这作品- 但每次调用它感觉非常笨拙,必须创建一个 Tuples 的临时列表,然后将每个 Tuple 和 DirectCast 声明为 Object 以遵守强类型要求。
该函数的重点是在整个代码中提供一个简单的单行代码,以快速查找具有潜在多个、任意标准的列,但是调用中的所有这些操作使得任何不幸不得不维护的人都难以理解它这个...
是否有一种更智能/更简洁的方法来传递任意一组配对参数,其中一个配对项需要是任意Type?
【问题讨论】:
-
IEnumerable(Of T)有差异,但我不确定它会一直到达一个元组。也就是说,我确信您可以为声明为IEnumerable(Of Object)的参数提供IEnumerable(Of MyType)。除非您特别需要对列表进行索引访问,否则我建议您优先使用IEnumerable而不是List。 -
与您的问题无关,建议将
IIf函数的使用替换为If三元运算符。我注意到有一个使用If运算符从函数返回。 -
不要使用元组列表。使用字典。
-
谢谢@jmcilhinney - 我最初的精益是也使用
Dictionary,但我想我会遇到类似的问题,声明Dictionary(Of String, Object),然后尝试应用String或Integer作为Value一半,但现在已经测试过了,它工作正常(和所以更干净) -
推荐
If而不是IIf。后者是一个库函数,用于弥补该语言的 VBA 遗产版本中缺少前者,甚至我认为 .NET 遗产 VB 的早期版本(因此出于兼容性原因在 .NET 的更高版本中仍然存在) .因为它是一个库函数,所以它不能做短路并且它没有任何类型安全性。
标签: vb.net object tuples parameter-passing