2012-05-11 16 views
7

Kodumda, paketlerde bir simge olarak kodlanmış öğelerin metin adlarıyla çalışmak istiyorum.Anahtar nasıl kullanılır?

Her zamanki durumda, 1012, cat, dog, cat, frog benim için anlamındadır, ancak bunun gibi birçok çift daha vardır, bu yüzden hepsini hatırlamak zor. Bazen değiştirilmeleri gerekiyor, bu yüzden bu amaçla bir Dictionary<string, int> kullanmam gerektiğini düşündüm. Ama sonra ...

switch (symbol) 
{ 
    case "0": { /* ... */ } 
    case "1": { /* ... */ } 
    case "2": { /* ... */ } 
    case "n": { /* ... */ } 
} 

... ...

switch (symbol) 
{ 
    case kvpDic["cat"]: { /* ... */ } 
    case kvpDic["dog"]: { /* ... */ } 
    case kvpDic["frog"]: { /* ... */ } 
    case kvpDic["something else"]: { /* ... */ } 
} 

olur ve stüdyo benim anahtarı için sabitleri kullanmak gerektiğini söylüyor.

Nasıl çalışır?

Upd: örneğin hayvan ve değer çifti sayısı sadece zamanında bilinen, bu nedenle kod sabitleri (herhalde) kullanmak gerekir.

+0

Anahtar bloklarında neler yapıyorsunuz? Temel olarak * sabit olmayan değerleri açamazsınız, bu yüzden * bazı * alternatifleri düşünmeniz gerekir. Çeşitli seçenekler var, ancak daha fazla bilgiye ihtiyacımız var. –

+3

Bunun yerine bir "enum" kullanmayı düşündünüz mü? Veya değerler çalışma zamanında mı değişiyor? –

+0

Texture2D'yi yeni bir hareketli grafiğe atarım ve her durum için benzersizdir. – user1306322

cevap

15

Bunun yerine sözlükte bir Func<T> veya Action depolayabilirsiniz.

var dict = new Dictionary<int, Action>(); 
dict.Add(1,() => doCatThing()); 
dict.Add(0,() => doDogThing()); 
dict.Add(2,() => doFrogThing()); 

Sonra şöyle kullanabilirsiniz:

var action = dict[1]; 
action(); 
+4

+1. Gerçekten harika bir kombinasyon;) – Sascha

+1

"Aksiyon Sözlüğü" sadece havalı geliyor. Çocuk çizgi filminde duyduğum bir şey gibi geliyor. Aksiyon Sözlüğünün burada olduğundan korkma! – Servy

+0

@Servy: Çocukların saçmalıklarını korkutmak için kullanacağınız bir şey gibi geliyor;) –

1

Sırasıyla bu dil kısıtlama VS kısıtlama var değil. Yani tam olarak istediğini yapamayacaksın. Bir fikir bir enum kullanmaktır. Bir enum, girişleri için bir char değeri kullanamaz, bunun hakkında bilgi için Why we can't have "char" enum types'a bakın.

0

Sözlük kullanmadan bir numara kullanmak istiyorsunuz.

enum AnimalsEnum { Dog, Cat, Bird, Fish }; 


public whathuh(AnimalsEnum whichAnimal) { 
switch(whichAnimal) { 
    case AnimalsEnum.Dog: 
    case AnimalsEnum.Cat: 
... 
} 

} 
İlgili konular