Mehrere Werte in einem einzigen Wert speichern und auch wieder auslesen

  • VB.NET

Es gibt 60 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Mehrere Werte in einem einzigen Wert speichern und auch wieder auslesen

    Hallo Leute,

    ich stehe gerade auf der Leitung.

    Ich habe für die Wochentage Montag bis Sonntag Werte vergeben (1,2,4,8,16,32,64).
    Nun kann der Nutzer beliebig viele Wochentage auswählen und ich rechne entsprechend die Werte zusammen um eine einzige Zahl zu erhalten, welche ich dann in der Datenbank ablege. Das funktioniert soweit und soll nur den Hintergrund meiner Anfrage erklären.

    Nun muss ich diesen Wert für die Anzeige am Bildschirm wieder in eine Klartextausgabe (String) umwandeln.
    So könnte ich das lösen, ist mir aber zu if-then lastig programmiert (HappyHour(i).Wochentage enthält z.B. den Wert 12 = Mittwoch und Donnerstag:

    VB.NET-Quellcode

    1. Dim WochenTag As String = ""
    2. Dim TempWochentage As Integer = HappyHour(i).Wochentage
    3. If TempWochentage >= 64 Then WochenTag = " So" + WochenTag : TempWochentage = TempWochentage - 64
    4. If TempWochentage >= 32 Then WochenTag = " Sa" + WochenTag : TempWochentage = TempWochentage - 32
    5. If TempWochentage >= 16 Then WochenTag = " Fr" + WochenTag : TempWochentage = TempWochentage - 16
    6. If TempWochentage >= 8 Then WochenTag = " Do" + WochenTag : TempWochentage = TempWochentage - 8
    7. If TempWochentage >= 4 Then WochenTag = " Mi" + WochenTag : TempWochentage = TempWochentage - 4
    8. If TempWochentage >= 2 Then WochenTag = " Di" + WochenTag : TempWochentage = TempWochentage - 2
    9. If TempWochentage >= 1 Then WochenTag = " Mo" + WochenTag
    10. WochenTag = Trim(WochenTag)


    Gibt es da nicht eine einfachere Lösung mit einer mathematischen Berechnungsfunktion?

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dive26“ ()

    Das kannst du relativ einfach prüfen, in dem du einen Bit-Vergleich durchführst und aus einem Array die Werte ausliest.
    Ein Beispielarray wäre {"Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"}.
    Wenn du nun durch die Länge des Arrays gehst und angesprochenen Bit-Vergleich machst, kannst du schnell die Wochentage zusammenführen.

    VB.NET-Quellcode

    1. For i As Integer = 0 To Array.Length - 1 Do
    2. If ((days >> i) And 1) = 1 Then
    3. ' Alternative:
    4. If (days And (1 << i)) = 1 << i Then
    5. result &= Array[i] & " "
    6. End If
    7. Next

    Wenn dus in einer Zeile haben willst (nicht die unbedingt beste Möglichkeit): string.Join(", ", Enumerable.Range(0, Array.Length).Where(i => days & (1 << i) == (1 << i)).Select(i => Array[i]));

    Speichern musst du allerdings so If-lastig machen, außer du hast ein Arrays aus Wahrheitswerten (Boolean), womit es dann wieder einfacher wird.
    Wo und wie er sie auswählt ist für die Frage eigentlich irrelevant. Wichtig ist nur, dass in einer Integer-Variable (also eine Zahl) die Info drin steckt welche Wochentage enthalten sind.

    Beispielsweise bedeutet der Wert 3, dass Montag(1) und Dienstag(2) enthalten sind.
    Der Wert 127 zum Beispiel würde alle Wochentage enthalten.


    Aber falls es Dich interessiert. Ich habe 7 Checkboxen mit dem jeweiligen Wert im Feld Tag.

    VB.NET-Quellcode

    1. IntergerVariableWochentage=cInt(checkbox_Mo.tag)+cInt(checkbox_Di.tag)+ .....



    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „dive26“ ()

    dive26 schrieb:

    wo und wie er sie auswählt ist für die Frage irrelevant.

    Für mich ist es relevant. Aber gut, du bist ja bekannt dafür, dass du gar keine Lösungen haben willst... (Ich sollte einfach meiner Ignore-Liste treu bleiben und keine Beiträge von diesen Mitgliedern lesen) :rolleyes:

    Aber hier trotzdem ein Ansatz:
    Ein Enum von Wochentagen von 0 bis 6. Jeder Tag ist jeweils eine 2er Potenz von seinem Enumwert. Am Ende addierst du alle ausgewählten 2er Potenzen zu einer Zahl.
    dafür nimmt man Enums. Und bearbeiten tut man die mit bitweisen Operanden.
    In dieses Buch lesen (hingegen das Galileio-Openbook ist Mist) ist ein ausgezeichnetes Kapitel über Enums - bisserl anspruchsvoll, aber im Wesentlichen vollständig.

    Kannst auch direkt auf MSDN gugge, ob da die Erklärung einfacher ist.
    Entschuldige Sonne, habe meine Frage gerade nochmals durchgelesen und MEINEN Fragefehler entdeckt.

    Der Wert ist bereits vorhanden (wurde vorher in einer anderen Funktion eingelesen).

    Nun möchte ich nur noch aus dem einen Integer-Wert (z.B. 33) erfahren ob da zum Beispiel der Wert "32" enthalten ist. Ich dachte es gäbe da eine mathematische Berechnungsfunktion dafür.

    Also so in der Art:

    WochentageWertInteger= 33
    Ich möchte herausfinden ob der Wert 32 in diesem Wert enthalten ist.


    If WochentageWertInteger XYFUNCTION 32 then ...
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    warum speicherst du die auswahl an tagen nicht direkt als string-array?
    ich nehme mal an, dass du am ende die zahl wieder auftrotteln wirst um die jeweiligen tage raus zu bekommen. wenn das dein ziel der ganzen übung ist, biste mit dem array besser drann.

    und zum entschlüsseln des integers musste den selben algorythmus nehmen wie zu verschlüsseln. damit haste deine funktion
    Dein Wert ist 8 Bit lang, von denen 7 Bits gesetzt werden können:

    0xxxxxxx, wobei x 0 oder 1 seind kann. D.h. du musst nur prüfen, welche Stellen mit 1 belegt sind.

    Z.B. 33 ist binär 0010 0001. D.h. Montag und Samstag sind gesetzt (0. und 5. Bits sind gesetzt).

    Du musst in der Schleife jedes Bit prüfen (Wert>>i And 1)>0 und je nach i den Wochentag zuweisen.
    @affrop

    Dein Einwand mit dem Array ist berechtigt. Ich wollte nur so wenig separate Datenfelder wie möglich generieren, da ich auch immer an die Übertragung der Datensätze per TCP denke (mobile Geräte). Das war eigentlich mein Hauptgrund warum ich das so lösen wollte. Ob 100 Integerwerte oder 700 Strings gespeichert werden müssen macht schon einen Datenmengen-Unterschied. Als Alternative könnte ich jeden Tag auch als Integer oder Boolean in ein eigenes Datenfeld ablegen. Ich werde einmal ein paar Varianten testen.

    if HappyHour(i).Montag_Boolean = True then ...
    if HappyHour(i).Montag_Integer = 1 then ...
    if HappyHour(i).Montag_String="Mo" then ...

    Im späteren Programmverlauf muss ich ja auch den aktuellen Wochentag aus der aktuellen Systemzeit abfragen. Da erhalte ich dann ja eigentlich entweder einen String "Montag" (nicht so gut) oder einen Integer Wert (0 oder 1). Einen Integerwert könnte ich widerum "schneller" und einfacher vergleichen.

    Ich sehe schon, da muss ich selbst noch einiges austüfteln.

    Da es scheinbar keine spezielle mathematische Funktion gibt die ermittelt ob ein Wert X im Wert Y enthalten ist, hat sich meine Anfrage erledigt.

    Danke Euch recht herzlich.
    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    natürlich gibts ne mathematische definition dafür. die musst du dir nur selbst herleiten.
    wenn du beispielsweise prüfen willst ob 32 in 33 enthalten ist musste ja nur fragen oben 32<=33? die frage ist nur wass de mit dem rest anstellst.

    übrigens kannste dein problem mit integer auch so lösen:

    VB.NET-Quellcode

    1. dim montag as integer=0
    2. dim dienstag as integer=0
    3. .
    4. .
    5. .
    6. if montag_check.checked=true then
    7. montag=montag+1
    8. end if
    9. Label1.Text="Anzahl Montage: " & montag.ToString
    @dive26:: Mach ein Enum, wie schon EDR es sagte:
    Wochentage

    VB.NET-Quellcode

    1. Public Class Form1
    2. 'Ich habe für die Wochentage Montag bis Sonntag Werte vergeben (1,2,4,8,16,32,64).
    3. <Flags()>
    4. Enum Wochentage
    5. No = 0 ' Null-Wert zur Initialisierung
    6. Montag = 1
    7. Dienstag = 2
    8. Mittwoch = 4
    9. Donnerstag = 8
    10. Freitag = 16
    11. Samstag = 32
    12. Sonntag = 64
    13. End Enum
    14. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    15. Dim tage As Wochentage = Wochentage.No
    16. tage = tage Or Wochentage.Montag
    17. tage = tage Or Wochentage.Mittwoch
    18. tage = tage Or Wochentage.Freitag
    19. MessageBox.Show(tage.ToString)
    20. End Sub
    21. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hier eine weitere Demo ...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim wt As New Wochentage
    3. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. Me.ListBox1.DataSource = [Enum].GetNames(GetType(Wochentage))
    5. Me.ListBox1.SelectionMode = SelectionMode.MultiSimple
    6. End Sub
    7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    8. Debug.Print("{0} (Wert: {1})", wt.ToString, CInt(wt).ToString)
    9. End Sub
    10. Private Sub ListBox1_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles ListBox1.SelectedValueChanged
    11. wt = 0
    12. For Each item In DirectCast(sender, ListBox).SelectedItems
    13. Dim value As Wochentage
    14. If [Enum].TryParse(item.ToString, value) Then
    15. wt = wt Or value
    16. End If
    17. Next
    18. End Sub
    19. End Class
    20. <Flags()> Enum Wochentage
    21. Montag = 1
    22. Dienstag = 2
    23. Mittwoch = 4
    24. Donnerstag = 8
    25. Freitag = 16
    26. Samstag = 32
    27. Sonntag = 64
    28. End Enum