2016-05-01 2 views
0

Это ответвление 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. Но это серьезно уродливое и много других строк, чем хотелось бы.

+0

являются значения монотонно возрастает по дате? –

ответ

1

Чтобы удалить строки из SortedDictionary по сравните пункт N к N-1 в словаре и без использования Linq, я предлагаю следующее решение:

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 
+0

Это работает только если вы включили Linq, который я не могу включить (он не существует на других платформах). –

+0

Я изменяю ответ, используя только Framework 2.0 (без Linq)! –

+0

Действительно, и я только что увидел это сейчас. Это то, что я тоже реализовал. Мне показалось странным, что нет более простого способа сделать это. –

Смежные вопросы