2010-12-02 6 views
6

0 Ich muss brauchen Wörterbuch zu erstellen, dessen Schlüssel String ist und Werte ist entweder (Delegat-Funktion oder Zeichenfolge).Wie Funktion oder Zeichenfolge als Wert im Wörterbuch (C#)

Da möchte ich Callback-Mechanismus implementieren, wobei ich manchmal Funktion für mehr Verarbeitung benötigt, die String zurückgibt und manchmal nur feste Zeichenfolge benötigt.

Gibt es eine Möglichkeit, das in C# zu tun?

Danke

+5

Viele anonym downvotes auf die Antworten auf diese Frage verwendet. Hat jemand wirklich die Bälle, um sie zu erklären? –

+0

@Robert, Downvoter schlug wieder auf Mark und meine Antworten. Ärgerlich – JaredPar

Antwort

7

Ich denke, der einfachste Weg, eine Dictionary<string, Func<string>> zu schaffen. Dies kann natürlich den Rückruf Fall halten. Für den Nicht-Rückruf-Fall können Sie ein triviales Lambda erstellen, um den hartcodierten Wert zurückzugeben.

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 Pflege zu erklären? – JaredPar

+0

BTW, ich habe einige generische Delegate-Fabriken, die einen ähnlichen Ansatz ohne Lambdas ermöglichen. Bei einer Identitätsfunktion wäre die Syntax in VB wie folgt: "m_map (Schlüssel) = FunctionOf (Of String, String) .NewInv (AddressOf IdentityFunction, Value)". Nicht wirklich schrecklich. Anders als bei Lambdas kommt der Umfang nicht in Frage. – supercat

2

den Wert des Wörterbuchs als Objekt deklariert.

+1

+1: Der Downvote wurde nicht aufgerufen. –

+0

Danke, einverstanden. Es sieht so aus, als würde der Wahlkampf außer Kontrolle geraten. –

6

Wenn Sie eine feste Zeichenfolge benötigen, können Sie stattdessen eine Funktion erstellen, die eine feste Zeichenfolge zurückgibt. Dann müssen Sie in beiden Fällen nur mit Funktionen arbeiten, die Strings zurückgeben.

+0

+1 Basierend auf Benchmarks, die ich in der Vergangenheit in Bezug auf solche Dinge gemacht habe, bietet dieser Ansatz die beste Leistung und ist wirklich einfach. – StriplingWarrior

+0

Es ist nicht wirklich das Gleiche. Zum einen, wenn Ihr String nicht konstant ist, sondern dynamisch aufgebaut ist, müssen Sie mehrere Funktionen haben, ihre String-Daten beibehalten, und dann kommen Sie in die Frage der Parallelität und der Daten werden geändert, während es im Wörterbuch ist, usw –

3

Ein Dictionary<string, object> würde den Trick tun, müssen Sie nur das Ergebnis zu string oder Func<string>.

+1

Downvote für die Beantwortung der Frage? "Ja wirklich?" – dahlbyk

+1

+1: Der Downvote wurde nicht aufgerufen. –

+0

Upvoted, um dem Downvote entgegenzuwirken und Ihrer Antwort zuzustimmen! :) –

1

Erstellen Sie ein Objekt mit einer Zeichenfolgeneigenschaft. Dieses Objekt hat die Smart, um den String zurückzugeben, oder ruft die Funktion auf, um den String basierend auf seinem Konstruktor zu erhalten. Dann legen Sie diese in Ihrem Wörterbuch Wörterbuch

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

Ein Beispiel, das ein Wörterbuch

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(); 
} 
Verwandte Themen