2016-05-19 3 views
0

Ich hatte gerade ein kleines Problem. Ich habeDictionary mit Enum Werttyp - Aufruf des Indexers für einen Schlüssel nicht im Wörterbuch?

IDictionary<Something,MyEnum> map;

Ich dachte, ein Verfahren zu schreiben:

MyEnum GetMapping(Something x); 

Verwendet ein bisschen wie:

MyEnum e = GetMapping(x) 
if(e!=null){...} 

Aber natürlich ist das Problem seit MyEnum ist ein Standard Enum based auf int, GetMappingkann nicht zurück NULL. Das Hinzufügen einer separaten DoesMappingExist Methode scheint unordentlich, gibt es eine nette Möglichkeit, dies zu beheben?

Und was würde map[AnObjectNotInTheMap] eigentlich zurückgeben - einfach Default(MyEnum), d. H. 0?

+2

Sie können NULL-Werte verwenden: 'MyEnum? GetMapping (...) ' –

+0

Ich bin nicht sehr vertraut mit diesem bisschen C# Funktionalität, es sieht ideal aus –

+0

Sie können den ersten Wert namens' 'null'' oder' 'keine Auswahl'' hinzufügen, Standard wäre der erste Wert von enum –

Antwort

1

Sie können Werttypen verwenden als nullables Nullable<T> verwenden, eine Abkürzung für diese ist T?.

Also, sollten Sie Ihren Code so etwas wie dieses:

MyEnum? GetMapping(Something x) 
{ 
    if (...) return MyEnum.SomeValue; 
    if (...) return MyEnum.OtherValue; 

    return null; 
} 

Dann ist es wie folgt verwenden:

MyEnum? e = GetMapping(x); 
if(e.HasValue) 
{ 
    var mapped = e.Value; 
    ... 
} 
+0

Also sollte ich 'e.HasValue' nicht' e! = null' verwenden? –

+0

@ Mr.Boy: Sie können beide verwenden, aber 'HasValue' ist das empfohlene. –

2

Gehen Sie einfach mit Nullable-ENUM:

IDictionary<Something,MyEnum?> map;

Und Ihre Methode ändert sich auch als:

MyEnum? GetMapping(Something x);

0

Der Standardwert von Enum ist 0. So weisen Sie nicht 0 für jedes Mitglied von MyEnum kann 0 ein No-Mapping anzeigen. Dies sollte die einfachste Implementierung sein, es sei denn, in MyEnum muss 0 zugewiesen werden.

Verwandte Themen