Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] 3 statussen met enum

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Normaal als ik van een product, object, wat dan ook aan probeer te geven of het actief is of niet is dat makkelijk, aangezien er maar 2 statussen zijn. In mijn geval specifiek:

code:
1
h => h.IsActive ? "Actief" : "Inactief"


Echter nu is het zo dat er een status bijgekomen is genaamd "In behandeling". Dan werkt mijn normale oplossing uiteraard niet.

Na wat zoeken kwam ik op de suggestie om 'enum' te gebruiken. Dus in dit geval:

code:
1
2
3
4
5
6
public enum IsActive
{
Actief = 0,
In behandeling = 1,
Inactief = 2
}


Verder dan dit kom ik echter niet. Ik wil, afhankelijk van de status, iets uitvoeren. Net zoals ik deed toen ik bool gebruikte als er maar 2 statussen waren.

Ongetwijfeld een hele simpele oplossing maar ik kom er niet meer uit.

Ik hoop dat jullie mij kunnen helpen hiermee.

  • Cloud
  • Registratie: November 2001
  • Laatst online: 03-11 10:25

Cloud

FP ProMod

Ex-moderatie mobster

Ik zou de naamgeving van je enum wel wat aanpassen, want de huidige naam doet vermoeden dat er maar twee statussen mogelijk zijn (zoals je vroeger had).

Stel je noemt het veld van het object waarin de enum staat State en je noemt je enum States.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
switch (h.State) 
{
  case Actief:
    // doe actief ding
    break;
  case InBehandeling:
    //doe behandeling ding
    break;
  case Inactief:
    // doe inactief ding
    break;
}

Of als je je oude vraag in de nieuwe situatie opnieuw wil stellen:
C#:
1
2
if (h.State == States.Actief)
  // doe je actieve ding

Enums zijn ideaal voor wat jij nodig hebt en best eenvoudig in gebruik :) Het is daarnaast slim om per enum meteen al de integer waarde op te geven, zodat die vast staat mochten er in de toekomst wijzigingen gedaan worden.

Never attribute to malice that which can be adequately explained by stupidity. - Robert J. Hanlon
60% of the time, it works all the time. - Brian Fantana


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Switch statement gebruiken.

C#:
1
2
3
4
5
6
7
8
9
10
11
switch (h.Status)
  case Status.Actief:
    //blablabla
    break;
  case Status.In_behandeling:
    //blablabla
    break;
  case Status.Inactief:
    //blablabla
    break;
}


Ah, cloud was/is me voor :( :P

Als je dan toch staat op een ternary:

C#:
1
h => h.State == State.In_behandeling ? "In behandeling" : h.State == State.InActive ? "Inactief" : "Actief"

Zoiets :P Puur onleesbare code :Y)
Beter gebruik je, zoals Woy hieronder zegt, voor weergave doeleinden een DisplayNameAttribute (die overigens, helaas, niet op Enums van toepassing is, maar makkelijk zelf te implementeren) of desnoods gewoon een .ToString() op je enum.

[ Voor 83% gewijzigd door RobIII op 04-06-2014 12:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Sowieso is het niet mogelijk om spaties in je enum waardes op te nemen, maar op een enums kan je gewoon vergelijken met bijvoorbeeld de == operator, of je kunt ze in switches gebruiken.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
enum Status { Actief, InBehandeling, InActief, .... }

var myStatus = Status.Actief;

if( myStatus == Status.Actief )
    //DoSomething;

switch(myStatus)
{
   case Status.Actief:
       //DoSomething
        break;
   case Status.InBehandeling:
       //DoSomething
        break;
   case Status.InActief:
       //DoSomething
        break;
/* Als de vorige cases niet geraakt zijn */
    default:
         break;
}


Als het puur om het weergeven van de naam van de status gaat kun je eens kijken naar het gebruik van Attributes zoals DisplayNameAttribute

edit:

/spuit 11 :+

[ Voor 10% gewijzigd door Woy op 04-06-2014 12:13 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Vishari Beduk
  • Registratie: Februari 2009
  • Laatst online: 21-11 23:11

Vishari Beduk

loves f/1.8 primes

C#:
1
2
3
4
5
6
7
8
9
10
11
public string AfhankelijkVanDeStatusIetsUitvoeren(IsActive deStatus)
{
    switch (deStatus)
    {
        case IsActive.Actief: return "Actief";
        case IsActive.InBehandeling: return "InBehandeling";
        case IsActive.Inactief: return "Inactief";
    }

    throw new NotImplementedException();
}


te laat

[ Voor 4% gewijzigd door Vishari Beduk op 04-06-2014 12:21 . Reden: nog een spuit 11 ]

weet het niet meer


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 09:57
Als je merkt dat je op veel plekken staat te switchen kun je de constructie ook vervangen door polymorfisme, dwz voor elke case een aparte class die een interface implementeren.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
- Ik zag de updates niet -

[ Voor 96% gewijzigd door Verwijderd op 04-06-2014 13:32 ]


  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 20-11 21:10

Guldan

Thee-Nerd

Eens met de antwoorden hierboven maar ik zou dan wel in de default een ArgumentOutOfRange exception gooien. Dan krijg je namelijk wat sneller door dat iemand je enum heeft gewijzigd:

C#:
1
2
3
4
5
6
7
8
9
10
11
switch(myStatus)
{
   case Status.Actief:
       //DoSomething
        break;
//snip
/* Als de vorige cases niet geraakt zijn */
    default:
      throw new ArgumentOutOfRangeException("myStatus");
     break;
}


De enige opmerking die ik heb over mijn eigen code is dat ik het mooier zou vinden om iets meer uitleg te geven in de argumentOutOfRangeException maarja resharper wil het graag zo :).

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10 08:18
Een nog betere oplossing is een status 'unknown' (= 0)' toevoegen, en deze ook in je switch statement zetten.
Je voldoet dan aan:
MSDN: CA1008: Enums should have zero value

en een niet gesette enum is dan de waarde 'unknown' en niet 'actief' wat bij jou het geval is

This message was sent on 100% recyclable electrons.


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Een nullable enum is ook een optie. Deze gebruik ik persoonlijk liever. Ben sowieso geen fan van Enum's. Omdat deze vaak leiden tot oneindige aantal switch statements.

  • Corniel
  • Registratie: April 2002
  • Laatst online: 31-03 14:56

Corniel

De wereld is gek!

De labels in een resource file of attribuut van je enum zetten (eventueel in een dictionary). Geen switches meer, een duidelijke scheiden van layout en logica.

while (me.Alive) {
me.KickAss();
}

Pagina: 1