2010-12-02 13 views
6

anahtarı dize ve değerleri olan (delege işlevi VEYA dize) bir sözlük oluşturmanız gerekir.İşlev nasıl kaydedilir VEYA dize olarak sözlükte değer (C#)

Ben dize döndürür ve bazen sadece sabit dize gerek daha işlenmek üzere işlev ihtiyaç burada bazen, mekanizmayı geri çağırmak uygulamak istiyoruz, çünkü.

Bunu C# yapmak için herhangi bir yolu var mı?

Teşekkür ederiz

+5

sürü kullanan bir örnek. Aslında onları açıklamak için topları var mı? –

+0

@Robert, downvoter Mark ve cevaplarıma tekrar vurdu. Rahatsız Edici – JaredPar

cevap

7

bu koymak Ben en kolay yolu bir Dictionary<string, Func<string>> yaratmak olduğunu düşünüyorum. Bu, geri arama durumunu açık bir şekilde tutabilir. Geri arama olmayan durum için, sabit kodlanmış değeri döndürmek için önemsiz bir lambda oluşturabilirsiniz.

private Dictionary<string, Func<string>> m_map; 
public void AddValue(string key, string value) { 
    m_map[key] =() => value; 
} 
public void AddValue(string key, Func<string> value) { 
    m_map[key] = value; 
} 
+0

@Downvoter'ın açıklamasını ister misiniz? – JaredPar

+0

BTW, lambda olmadan benzer bir yaklaşıma izin veren bazı genel delege fabrikalarım var. Bir kimlik işlevi verildiğinde, VB'deki sözdizimi şöyle olurdu: "m_map (anahtar) = FunctionOf (Dize, Dize) .NewInv (AddressOf IdentityFunction, Value)". Gerçekten dehşet verici değil. Lambdas'tan farklı olarak, herhangi bir kapsam sorunu yok. – supercat

2

Sözlüğün değerini nesne olarak bildirme. bunun yerine sabit bir dize döndüren bir işlev oluşturabilirsiniz sabit dize olması gerekir durumda

+1

+1: Reddedilme nedeni atılmamıştı. –

+0

Teşekkür ederim, kabul etti. Oylama yarışması elden çıkıyor gibi görünüyor. –

6

. Daha sonra her iki durumda da sadece dizeleri döndüren işlevlerle uğraşmanız gerekir.

+0

+1 Geçmişte bu tür şeyleri yaptığım kriterlere dayanarak, bu yaklaşım size en iyi performansı verecek ve gerçekten basit. – StriplingWarrior

+0

Gerçekten aynı şey değil. Bir şey için, eğer dizginiz sabit değilse de, dinamik olarak yapılandırılmışsa, çok sayıda fonksiyona sahip olmanız, dizge verilerinin devam etmesini sağlamalısınız ve sonra eşzamanlılık ve sözlükte olduğu gibi değiştirilen veriler ile karşılaşabilirsiniz. –

3

Dictionary<string, object> bir numara yapar, sonucu yalnızca veya Func<string>'a göndermeniz gerekir.

+1

Soruyu cevaplamaktan kaçındınız mı? Gerçekten mi? – dahlbyk

+1

+1: Reddetme için çağrı yapılmamış. –

+0

Downvote karşı koymak için ve senin cevabını kabul etmek için! :) –

1

Dize özelliği olan bir nesne oluşturun. Bu nesne dizgeyi döndürmek veya yapıcısını temel alarak kurucuyu almak için işlevinizi çağırmak için akıllılara sahiptir. Sonra Sözlük Sözlük

public class MyCoolClass 
{ 
    public MyCoolClass(Func<string> getString) 
    { 
     m_getString = getString; 
    } 
    public MyCoolClass(string s) 
    { 
     m_string = s; 
    } 
    public string GetString() 
    { 
     return m_string ?? getString(); 
    } 
    private string m_string; 
    private Func<string> m_getString; 
} 
0

bir Dictionary Bu sorunun yanıtları anonim downvotes ait

static void Main() 
{   
    var dic = new Dictionary<string, Func<string>>(); 

    dic.Add("A",() => "Hello World"); // Constant lambda 
    dic.Add("B", ConstructString);  // Calculated 
    dic.Add("C", delegate { return string.Empty; }); // Anonymous delegate 
} 

static string ConstructString() 
{ 
    return DateTime.Now.ToString(); 
} 
İlgili konular