4

我试图自己解决这个问题,但也许我对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 都是隐式声明的变体变量。

我究竟做错了什么?我在帮助中读到它说:

用法

变量数组中的元素只有在它们属于相同类型时才会比较相等。变量数组不能包含类或对象。

包含空值的数组元素将匹配其他空值。

为空的数组元素将与其他为空的元素匹配。

好吧,本例中的变量数组包含日期/时间类型的变量变量。所以,如果我没看错的话,我没有做错任何事。

编辑:Notes 论坛上,用户Thoams Kennedy尝试了以下操作:

如果你像这样拼出时间分量

dateOne = CDat("12/16/2010 04:20:17 AM")

dateTwo = CDat("12/16/2010 04:20:17 AM")

它仍然会将它们视为不同的。似乎没有毫秒组件,所以我会说 ArrayUnique 不知道如何处理 DateTime 变体。

所以他的结论是 ArrayUnique 嗯,不起作用。

4

2 回答 2

2

好吧,这行得通:

%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 工作......

于 2010-12-16T19:30:22.820 回答
2

我做了一些测试,看起来 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 将只有一个元素。

或者,您可以在为它们分配日期值之前将 dateOne 和 dateTwo 作为 Doubles,这似乎也可以正常工作。

于 2010-12-17T01:37:55.083 回答