Avatar billede lasserasch Juniormester
23. juni 2011 - 15:07 Der er 21 kommentarer

Omregn 1, 2, 4, 8, 16, 32 - Altså bit værdier fra database til kode.

Hejsa.

En anden leverandør har lavet en database struktur hvor checkbox værdier bliver lagt sammen og gemt i en kollone i databasen.

Altså f.eks:

checkbox 1 = 1
checkbox 2 = 2
checkbox 3 = 4
checkbox 4 = 8
checkbox 5 = 16

Når der gemmes i databasen og checkbox 1, 2 og 4 var vinget af, ville værdien 11 altså blive gemt.

Jeg har brug for at kunne omdanne database værdien igen.

Jeg gør det helt low tech pt. Og jeg har på fornemmelsen at der sikkert findes en løsning som ikke kræver så mange linier kode.

Min løsning virker for mig, men jeg synes den er ret ufleksibel.

Nogle af jer der har andre tilgange til at løse denne udfordring?

        public List<string> TargetGroupValues()
        {
            int targetgroups = 0;
            int.TryParse(this.Targetgroup, out targetgroups);
            List<string> outputvalues = new List<string>();

            while (targetgroups > 0)
            {
                if (targetgroups >= 32)
                {
                    targetgroups = targetgroups - 32;
                    outputvalues.Add("Sygdomsramte");
                }
                else if (targetgroups >= 16)
                {
                    targetgroups = targetgroups - 16;
                    outputvalues.Add("Ældre");
                }
                else if (targetgroups >= 8)
                {
                    targetgroups = targetgroups - 8;
                    outputvalues.Add("Mænd");
                }
                else if (targetgroups >= 4)
                {
                    targetgroups = targetgroups - 4;
                    outputvalues.Add("Kvinder");
                }
                else if (targetgroups >= 2)
                {
                    targetgroups = targetgroups - 2;
                    outputvalues.Add("Unge");
                }
                else if (targetgroups >= 1)
                {
                    targetgroups = targetgroups - 1;
                    outputvalues.Add("Børn");
                }
            }
            return outputvalues;
        }
Avatar billede arne_v Ekspert
23. juni 2011 - 15:20 #1
Jeg ville kigge paa enten BitArray eller enum.
Avatar billede johny Nybegynder
23. juni 2011 - 15:22 #2
Hmm, jeg antager at du ikke går højere op end 32 ud fra hvad du viser der, og så ville jeg umiddelbart lave en Enum til det, det er vidst den hurtigste løsning, samt nemmest at kode op imod:

[Flags]
public enum CheckedCheckBoxes
{
  None = 0,
  Children = 1,
  Young = 2,
  Women = 4,
  Men = 8,
  Elderly = 16,
  Sick = 32
}

Så parser du din integer værdi til ovenstående enum, og på denne kan du så spørge ".HasFlag(CheckedCheckBoxes.Children)" f.eks. og så sætte et hak i den tilsvarende CheckBox.
Avatar billede johny Nybegynder
23. juni 2011 - 15:23 #3
Arne beat me to it. :)
Avatar billede arne_v Ekspert
23. juni 2011 - 15:38 #4
Kode:

using System;
using System.Collections;
using System.Collections.Generic;

namespace E
{
    public class Program
    {
        [Flags]
        private enum e { A=1, B=2, C=4, D=8, E=16 }
        private static string[] sa = { "A", "B", "C", "D", "E" };
        public static void Main(string[] args)
        {
            int v = 11;
            // BitArray
            BitArray ba = new BitArray(new int[] { v });
            for(int i = 0; i < 32; i++)
            {
                if(ba[i])
                {
                    Console.WriteLine(sa[i]); // or add to List<string>
                }
            }
            // enum
            foreach(e ev in e.GetValues(typeof(e)))
            {
                if((v & (int)ev) != 0)
                {
                    Console.WriteLine(ev); // or add to List<string>
                }
            }
            Console.ReadKey();
        }
    }
}
Avatar billede ch3oh Nybegynder
26. juni 2011 - 01:03 #5
Ville udnytte lidt af arven fra C, men ellers lægge mig op af Arne's løsning.

private enum eCases
{
    Børn = 0,
    Unge,
    Kvinder,
    Mænd,
    Ældre,
    Sygdomsramte
}

public List<string> TargetGroupValues()
{
    int targetgroups = 0;
    int.TryParse(this.Targetgroup, out targetgroups);
    List<string> outputvalues = new List<string>();
   
    foreach (eCases ev in eCases.GetValues(typeof(eCases)))
    {
        if (((1 << (Int32)ev) & targetgroups) != 0)
            outputvalues.Add(((eCases)ev).ToString());             
    }

    return outputvalues;
}
Avatar billede arne_v Ekspert
26. juni 2011 - 02:15 #6
Sum de siger i visse reklamer: proev det!

(jeg tror ikke meget paa 0 som vaerdi i denne sammenhaeng og uden angivelse af vaerdier mistaenker jeg dem for at vaere prev+1 og ikke prev<<1)
Avatar billede ch3oh Nybegynder
26. juni 2011 - 11:11 #7
Helt enig i prev+1.

Det er nu også 1-tallet der bliver bitshift'et.

Så efter Bitwise And skulle jeg da mene (x != 0) var rigeligt.
Avatar billede arne_v Ekspert
26. juni 2011 - 16:13 #8
Der er ikke noget galt med algoritmen.

Men forsoeg paa at OR'e flere enums sammen gaar totalt i ged hvis de numeriske vaerdier er fortloebne.
Avatar billede Syska Mester
27. juni 2011 - 01:13 #9
Det jeg tror arne_v prøver at siger er:

Mænd = 3

men du får også 1 og 2 ( Unge og Kvinder )
Avatar billede ch3oh Nybegynder
28. juni 2011 - 00:06 #10
Det skulle nu ikke være noget problem da bitshift fylder op med nuller.

0000 0001 << 3  ==  0000 1000

http://msdn.microsoft.com/en-us/library/a1sway8w.aspx#Y410
Avatar billede Syska Mester
28. juni 2011 - 00:45 #11
Hvordan vil du angive en liste med alle typer i ?

Hvad interger value vil du give den ?
Avatar billede arne_v Ekspert
28. juni 2011 - 00:51 #12
Metoden er fin nok, men det er enum'en ikke. Saa shift er ikke relevant.
Avatar billede olehaahr Nybegynder
30. juni 2011 - 21:25 #13
Det kan gøres meget enkelt.

public bool readbit(int tal, int bit)
{
    int x = 1;
    x = x << (bit-1);
    return (tal & x) != 0;
}


Funktionen returnerer TRUE, hvis bit <bit> i tallet <tal> er true.

MessageBox.Show(readbit(11, 1).ToString());
MessageBox.Show(readbit(11, 2).ToString());
MessageBox.Show(readbit(11, 3).ToString());
MessageBox.Show(readbit(11, 4).ToString());
MessageBox.Show(readbit(11, 5).ToString());

Mvh Ole
Avatar billede arne_v Ekspert
01. juli 2011 - 03:28 #14
For every complex problem there is an answer that is clear, simple, and wrong.

----

Spoerger oensker tekst i output.
Avatar billede olehaahr Nybegynder
01. juli 2011 - 08:29 #15
Det er altid vigtigt at læse opgaven helt igennem, inden man svarer:

Og udgangspunktet er, at brugeren har en række checkboxe, som gemmes i en database i en enkelt int, hvor hver bit svarer til værdien af en checkbox.

Nu ønsker brugeren at få værdien af int'en splittet ud igen, så han kan vise de forskellige checkboxe igen. Men han har ikke fundet den bedste løsning til det.

Derfor vælger han en klodset løsning med en liste...
Men jeg ser ingen steder at han efterspørger TEKST.

Så svaret til hans spørgsmål er:

checkbox1.checked = readbit(tal,1);
checkbox2.checked = readbit(tal,2);
checkbox3.checked = readbit(tal,2);
osv...

Nu varer det sikkert ikke længe inden han efterspørger funktionen "setbit", som kan sætte bitværdien.

Mvh Ole
Avatar billede arne_v Ekspert
01. juli 2011 - 18:34 #16
Jeg er ret sikker paa at:

public List<string> TargetGroupValues()

returnerer tekst strenge.
Avatar billede arne_v Ekspert
01. juli 2011 - 18:50 #17
Og brug af magiske tal konstanter giver ikke ligefrem bonus point for kunstnerisk udfoersel.
Avatar billede Syska Mester
02. juli 2011 - 20:23 #18
Vi er stadig unige i den del om det virker. Men sådan vil det jo være ... jeg har opstillet et scenarie som jeg ikke mener din kode kan overholde ...

mvh
Avatar billede arne_v Ekspert
08. august 2011 - 01:01 #19
Tid at faa afsluttet her?
Avatar billede lasserasch Juniormester
28. august 2011 - 19:05 #20
Hej alle. Undskyld min manglende respons her. Ja, lad os få lukket. Men nu læser jeg alle svar igennem og ved faktisk ikke rigtig hvem der skal have points.

Men smid et svar, i som vil have lidt points. Og så lukker vi denne tråd :-)

Mvh.
Lasse
Avatar billede arne_v Ekspert
06. september 2011 - 01:48 #21
svar fra mig
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester