LotusScript ArrayUnique函数似乎不适用于日期/时间数组
我试图找出我自己的这个问题,但也许有什么我误解ArrayUnique
的工作方式。LotusScript ArrayUnique函数似乎不适用于日期/时间数组
下面是一些示例的LotusScript代码:
'Let's test some dates
dateOne = CDat("12/16/2010")
dateTwo = CDat("12/16/2010")
testSuccess = (dateOne = dateTwo)
'On evaluation, testSuccess = true
'Now let's make an array ...
Dim someArray(1) As Variant
someArray(0) = dateOne
someArray(1) = dateTwo
uniqueArray = ArrayUnique(someArray)
'uniqueArray has the same two elements ... the duplicate hasn't been removed
在上述例子中,dateOne,dateTwo,testSuccess,和uniqueArray都是隐式声明的变体的变量。
我在做什么错?我在阅读the help那里说:
使用的变量数组
元素,如果他们是同一类型的,只会比较相等。变体数组不能包含类或对象。
包含空值的数组元素将与其他空值匹配。
空的数组元素将与其他空的元素相匹配。
那么,在本实施例中,变体数组包含变体变量,这些变量的日期/时间的类型。所以,如果我正确地阅读这篇文章,我没有做错任何事情。
编辑:在Notes Forums,用户Thoams肯尼迪尝试了以下内容:
如果你拼写出时间分量这样
dateOne = CDAT(“12/16/2010上午4点20分17秒 “)
dateTwo = CDAT(” 12/16/2010上午4点20分17秒“)
它仍然会将他们视为不同的人。似乎没有毫秒级的组件,所以我会说ArrayUnique不知道如何处理DateTime变体。
所以他的结论是ArrayUnique umm,不起作用。
我做了一些测试,它看起来像ArrayUnique只是不能处理LS数据类型7(日期/时间)。在内部,日期类型被存储为双打,所以你可以转换成双精度和双精度来获得这个工作。
例如:
'Now let's make an array ...
Dim someArray(1) As Variant
someArray(0) = Cdbl(dateOne)
someArray(1) = Cdbl(dateTwo)
uniqueArray = ArrayUnique(someArray)
uniqueArray将只有一个元素。
另外,您可以将Dim dateOne和dateTwo设置为双精度,然后再为它们指定日期值,而且这似乎也可以正常工作。
忘了提及,LS日期有一些很好的信息:http://searchdomino.techtarget.com/tip/0,289483,sid4_gci489484,00.html – 2010-12-17 01:38:28
那么,这个工程:
%REM
Function ArrayUniqueStringCompare
Since ArrayUnique doesn't seem to work in some cases (such as with date/time values),
Let's convert all of the elements to string and then perform arrayunique.
After performing unique, we can convert back to original type
This will crash if sourceArray is not an array.
%END REM
Function ArrayUniqueStringCompare(sourceArray As Variant) As Variant
typeOfElement$ = TypeName(sourceArray(0))
upperLimitSource% = UBound(sourceArray)
Dim stringArray() As String
ReDim stringArray(upperLimitSource%)
For i% = 0 To upperLimitSource%
stringArray(i%) = CStr(sourceArray(i%))
Next
'Now get the unique values...
uniqueArray = ArrayUnique(stringArray)
upperLimitUnique% = UBound(uniqueArray)
'Finally, convert the values back to their original data type
Dim returnArray() As Variant
ReDim returnArray(upperLimitUnique%)
For i% = 0 To upperLimitUnique%
If typeOfElement$ = "DATE" Then
returnArray(i%) = CDat(uniqueArray(i%))
End If
Next
ArrayUniqueStringCompare = returnArray
End Function
但可以肯定,这不可能是最好的解决办法,对不对?必须有一些更好的方法让ArrayUnique工作...
所以等待,在Notes中使用'Dim someArray(1)'声明一个大小为2的数组?因此,您可以将基于0的数组*的所有缺点与基于1的数组的所有缺点结合起来? AHAHAHAHAHAHAHAHAHAHAHA – 2010-12-16 19:37:07
@BlueRaja:你为什么笑我的痛苦? ;-) – Pandincus 2010-12-16 19:41:40
实际上,这是'Dim someArray(0到1)'的语法糖,省略了下界。你所估计的是数组的上限(假设为下限),而不是其长度。 – 2010-12-17 02:00:54