根据下一行或最后一行从Dictionary中删除行

时间:2016-05-01 16:18:42

标签: vb.net visual-studio-2013 sorteddictionary

这是this question的分支。因此考虑数据:

1/1/2000  10000
1/1/2001  10000
1/1/2002  10000
10/1/2003  11000
1/1/2004  11000
1/1/2005  11000
6/1/2006 10000
9/1/2006  12000

此数据被收集到SortedDictionary中,日期为关键字。我想将其转换为这种格式:

1/1/2000  10000
10/1/2003  11000
6/1/2006 10000
9/1/2006  12000

也就是说,对于任何给定的唯一值,我想要最早的日期项。通常当我遇到这种问题时,我会向后迭代......

for i = items.count - 1 to 1 step -1
    if item(i) is like item(i-1) remove item(i)
next

但你怎么用SortedDictionary做到这一点? Linq提供了一个反向枚举器和一个索引,但是Linq仅在Windows上可用。在我不熟悉的基础VB.net中有没有一种简单的方法可以做到这一点?

我通过制作List(Of Date),向后迭代,然后从List中删除条目来解决这个问题。然后我迭代结果并从SortedDictionary中删除任何键。但这比我想要的还要严重丑陋。

1 个答案:

答案 0 :(得分:1)

要通过比较字典中的项目N到N-1而不使用Linq从SortedDictionary中删除行,我提出以下解决方案:

1 - 将字典值转换为数组。

2 - 比较数组中的项目N到N-1。

3 - 从字典中删除索引行。

'sd is your SortedDictionary
Dim sdArray(sd.Keys.Count - 1) As Integer
sd.Values.CopyTo(sdArray, 0)

For i = sd.Keys.Count - 1 To 1 Step -1
    If sdArray(i) = sdArray(i-1) then
        Dim index As Integer = 0
        For Each p As KeyValuePair(Of DateTime, integer) In sd
            if index = i then sd.Remove(p.Key) : Exit For
            index += 1
        Next
    End If
Next

如果您希望任何给定唯一值的最早日期项目使用此代码:

For i = sd.Keys.Count - 1 To 1 Step -1
    For j = i - 1 To 0 Step -1
        If sdArray(i) = sdArray(j) then
            Dim index As Integer = 0
            For Each p As KeyValuePair(Of DateTime, integer) In sd
                if index = i then sd.Remove(p.Key) : Exit For
                index += 1
            Next
            Exit For
        End If
    Next
Next