2016-05-01 8 views
0

Dies ist ein Ableger von this question. Betrachten Sie Daten so:Entfernen von Zeilen aus einem Verzeichnis basierend auf der nächsten oder letzten Zeile

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 

Diese Daten gesammelt werden in eine SortedDictionary mit den Daten als Schlüssel. Ich möchte es in dieses Format konvertieren:

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

Das heißt, ich möchte das früheste datierte Element für einen bestimmten eindeutigen Wert. Normalerweise, wenn ich mit dieser Art von Problem dargestellt habe, würde ich rückwärts durchlaufen ...

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

Aber wie macht man das mit einem SortedDictionary? Linq bietet einen Reverse-Enumerator und ein Index-ish-Ding, aber Linq ist nur unter Windows verfügbar. Gibt es eine einfache Möglichkeit, dies innerhalb von VB.net zu tun, mit dem ich nicht vertraut bin?

Ich löste dies, indem ich eine List(Of Date) mache, rückwärts über diese iteriert und dann Einträge aus der List entfernt. Dann iteriere ich über das Ergebnis und entferne einen beliebigen Schlüssel aus der SortedDictionary. Aber das ist wirklich hässlich und viel mehr Zeilen, als ich gerne hätte.

+0

Ist die Werte monoton in Bezug auf das Datum zu erhöhen? –

Antwort

1

auf Zeilen von SortedDictionary durch Vergleichen Punkt N zu N-1 in einem Wörterbuch zu entfernen und ohne die Verwendung Linq schlage ich die folgende Lösung:

1-Wandel Wörterbuch Werte in Array.

2-Vergleiche Element N zu N-1 im Array.

3-Entfernen von Zeilen nach Index aus dem Wörterbuch.

'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 

Wenn Sie wollen, dass der älteste datierte Einzelteil für jeden eindeutigen Wert angegeben diesen Code verwenden:

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

Das funktioniert nur, wenn Sie Linq einschließen, das ich nicht einschließen kann (es existiert nicht auf anderen Plattformen). –

+0

Ich ändere die Antwort nur mit dem Framework 2.0 (ohne Linq)! –

+0

In der Tat, und ich habe das jetzt gerade gesehen. Das habe ich auch umgesetzt. Ich finde es merkwürdig, dass es keinen einfacheren Weg gibt, dies zu tun. –

Verwandte Themen