2010-12-02 14 views
6

Necesito crear un diccionario cuya clave es cadena y valores es (función de delegado O cadena).Cómo almacenar la función O cadena como valor en el diccionario (C#)

Porque, quiero implementar el mecanismo de devolución de llamada, en el que a veces necesito una función para más procesamiento que devuelve cadena y, a veces solo necesita una cadena fija.

¿Hay alguna manera de hacerlo en C#?

Gracias

+5

Mucha downvotes anónimas en las respuestas a esta pregunta. ¿Alguien realmente tiene las pelotas para explicarlos? –

+0

@Robert, downvoter volvió a atacar a Mark y mis respuestas. Molesto – JaredPar

Respuesta

7

Creo que la forma más fácil es crear un Dictionary<string, Func<string>>. Esto obviamente puede contener el caso de devolución de llamada. Para el caso de no devolución de llamada, puede crear un lambda trivial para devolver el valor codificado.

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 cuidado de explicar? – JaredPar

+0

Por cierto, tengo algunas fábricas delegadas genéricas que permiten un enfoque similar sin lambdas. Dada una función de identidad, la sintaxis en VB sería: "m_map (clave) = FunctionOf (Of String, String) .NewInv (AddressOf IdentityFunction, Value)". No es demasiado horrible, de verdad. A diferencia de lambdas, no hay cuestión de alcance. – supercat

2

Declare el valor del diccionario como objeto.

+1

+1: No fue necesario votar. –

+0

Gracias, de acuerdo. Parece que la competencia de votos se está yendo de las manos. –

6

En el caso en que necesite tener una cadena fija, en su lugar puede crear una función que devuelva una cadena fija. Luego, en ambos casos, solo necesita tratar con funciones que devuelven cadenas.

+0

+1 Basado en los puntos de referencia que he hecho en este tipo de cosas en el pasado, este enfoque le dará el mejor rendimiento, y es realmente simple. – StriplingWarrior

+0

No es realmente lo mismo. Por un lado, si su cadena no es constante, pero está construida dinámicamente, debe tener múltiples funciones, persistir sus datos de cadena, y luego entrar en la cuestión de la concurrencia y los datos que se cambian mientras está en el diccionario, etc. –

3

A Dictionary<string, object> haría el truco, solo tendrá que arrojar el resultado a string o Func<string>.

+1

Votación a la baja para responder a la pregunta? De Verdad? – dahlbyk

+1

+1: La votación downvote no estaba disponible. –

+0

¡Apoyado usted para contrarrestar la Votación negativa y aceptar su respuesta! :) –

1

Crea un objeto con una propiedad de cadena. Ese objeto tiene la inteligencia para devolver la cadena o llamar a su función para obtener la cadena en función de su constructor. A continuación, poner estos en su diccionario diccionario

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

Un ejemplo que utiliza un diccionario

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(); 
} 
Cuestiones relacionadas