gültiger Wert - bit(?)

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    gültiger Wert - bit(?)

    Moin!

    ich habe Werte die auch kombiniert werden dürfen.

    VB.NET-Quellcode

    1. Keiner = 0
    2. Ende = 1 'END geht nicht wegen VB.net
    3. Mittel = 2
    4. Zentrum = 4
    5. Punkt = 8
    6. Quadrant = 16
    7. Schnitt = 32
    8. Basis = 64
    9. Lot = 128
    10. Tangente = 256
    11. Nächster = 512
    12. Löscht_Alle = 1024
    13. Schnitt_angenommen = 2048
    14. Hilfslinie = 4096
    15. Parallel = 8192


    Der Wert von Schnitt und Basis ist zum Beispiel 32+64=96

    In der Ausgangssituation ist ein Wert bekannt - hier 96.

    Es gilt zu prüfen, ob 96 eine Summe irgendwelcher dieser Wert ist. Welche es sind ist dabei uninteressant.

    Gibt es dafür einen einfachen Weg oder muss man durchprobieren?

    Jan
    Sollte so gehen

    C#-Quellcode

    1. static bool IsValidValue<T>(T value)
    2. {
    3. if (!typeof(T).IsEnum)
    4. throw new Exception($"{typeof(T)} is no enum");
    5. var enumValues = Enum.GetValues(typeof(T)).Cast<T>();
    6. if (enumValues.Contains(value))
    7. return true;
    8. return enumValues.Where(x => (value as Enum).HasFlag(x as Enum)).Select(x => Convert.ToInt32(x)).Sum() == Convert.ToInt32(value);
    9. }

    @jan99 Fang an mit einem Flag-Enum.
    Dann nimmst Du alle bekannten Enum-Werte raus:
    Schleife über alle Enum-Werte DER_EINE_WERT (hatten wir neulich) und

    VB.NET-Quellcode

    1. Value = Value And Not DER_EINE_WERT
    Wenn Value irgendwann 0 ist, kamen nur erlaubte Enum-Werte vor.
    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!

    jan99 schrieb:

    'END geht nicht wegen VB.net
    Doch: [End]; Schlüsselwörter einfach in eckige Klammern setzen, dann sind sie verwendbar.
    Wieso ist es überhaupt möglich, dass Nicht-Enum-Werte kombiniert werden?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    HenryV schrieb:

    Korrigiert mich falls ich falsch liege.
    Die Enum hat binäre Werte. Das heisst doch, alle Werte von 0 bis 16383 sind möglich.

    Was machst du wenn im Enum nicht alle Werte angelegt sind? z.B

    VB.NET-Quellcode

    1. Quadrant = 16
    2. Schnitt = 32
    3. 'Basis = 64
    4. Lot = 128

    Dann könnten nicht mehr alle Werte aus den übrigen Enum-Membern gebildet werden.

    VaporiZed schrieb:

    Wieso ist es überhaupt möglich, dass Nicht-Enum-Werte kombiniert werden?
    Du kannst da jeden möglichen numerischen Wert dazu casten.
    Der Type stimmt, nur bei ToString() kommt der numerische Wert raus.
    Frage: Wo kommt ein solcher her?
    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!
    Das ist mir klar, ich hatte es uneindeutig formuliert. Mir stellt sich die Frage, warum das überhaupt vom Programmablauf möglich sein könnte.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Jou. @jan99 Woher kommt solch ein Wert?
    Ist Dein Enum unvollständig?
    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!