2017-09-22 2 views
0

Ich habe eine Klasse, deren primäres Klassenmitglied eine Dictionary(Of DateTime,CustomClass) ist. Ich möchte eine Methode schreiben, die Elemente des Wörterbuchs löscht, wenn bestimmte Bedingungen erfüllt sind, ähnlich einer .Where(Function(p) p.isTrue) Funktion. Ich habe eine Dokumentation über die Verwendung eines Prädikats, aber nichts über das Bauen mit einem gefunden. Ist das möglich?Klassenmethode mit einem Funktions-/Prädikatparameter

+0

Ich habe dies in einer Klasse, um Mapping zu tun, aber es scheint übertrieben für das kleine Bit, das Sie beschrieben. Sie konnten die Kriteriendaten nicht an die Methode übergeben. Einige Parameter können optional sein und übersprungen werden, wenn sie die Standardeinstellung – Plutonix

Antwort

0

Ich bin in der Regel alle Gung-ho für LINQ, aber das ist eine Situation, in der ich denke, dass Sie rückwärts durch das Wörterbuch mit einer For/Next Schleife durchlaufen und entfernen Sie die Elemente, die Ihre Bedingungen nicht erfüllen:

Public Class Foo 

    'Primary class member 
    Public Property Bar As Dictionary(Of DateTime, Foo) 

    'Remove method based on some condition (you may want to pass a parameter here too) 
    Public Sub Remove() 
     'Use a For/Next loop backwards 
     For index As Integer = Me.Bar.Keys.Count - 1 To 0 Step -1 
      'Check for if the condition is met and then remove the item by its index 
      'If ... Then 
      ' Me.Bar.Remove(Me.Bar.ElementAt(index).Key) 
      'End If 
     Next 
    End Sub 

    Sub New() 
     Me.Bar = New Dictionary(Of DateTime, Foo) 
    End Sub 

End Class 
+0

sind Ich hoffte auf etwas ein wenig mehr Dynamik, es war auch eine leicht akademische Übung. Das Problem dabei ist, dass es nur für 1 Bedingung funktioniert. Ich hatte gehofft, in der Lage zu sein, die gleiche Methode für Datumsvergleiche oder Attribute von 'Foo' zu verwenden. – Andrew

+0

Es ist nicht nur für Daten, Sie würden einfach alle Bedingungen (Datum und Ihre benutzerdefinierte Klasse) in der If-Anweisung festlegen. Geben Sie mir ein konkreteres Beispiel und ich werde Ihnen ein besseres Beispiel geben. – David

+0

Ich denke, das OP möchte in der Lage sein, die Bedingung als Parameter zu übergeben, so dass er es nicht in der 'Remove()' -Funktion fest codieren müsste. So etwas wie Bozhidar vorgeschlagen hat. –

0

Ja, es ist möglich.

erklären Sie einfach eine Methode mit einem Func(Of...) Argument, das den Zustand darstellt:

Public Sub RemoveElementIf(condition As Func(Of KeyValuePair(Of DateTime, Foo), Boolean)) 

    If condition IsNot Nothing Then Bar = Bar.Where(Function(x) condition(x)) 

End Sub 

Dann sind Sie LINQ intern verwenden können.

Verwandte Themen