如何在字典中存储函数或字符串值(C#)

6

我需要创建一个字典,其键为字符串,值为(委托函数或字符串)之一。

因为我想实现回调机制,有时需要用于更多处理的返回字符串的函数,有时仅需要固定字符串。

在C#中有没有办法做到这一点?

谢谢


5
这个问题的答案收到了很多匿名的踩。有没有人真的有勇气来解释一下? - Robert Harvey
@Robert,踩分者又在Mark和我的回答上动手了。很烦人。 - JaredPar
6个回答

7
我认为最简单的方法是创建一个Dictionary<string, Func<string>>。这个字典可以显然地包含回调函数。对于非回调函数,您可以创建一个微不足道的lambda表达式来返回硬编码值。
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;
}

顺便说一下,我有一些通用的委托工厂,可以在没有lambda的情况下采用类似的方法。在VB中,给定一个身份函数,语法将是:"m_map(key) = FunctionOf(Of String, String).NewInv(AddressOf IdentityFunction, Value)"。实际上并不太可怕。与lambda不同,没有作用域的问题。 - supercat

6

如果需要一个固定的字符串,您可以创建一个返回固定字符串的函数。这样,在两种情况下,您都只需要处理返回字符串的函数。


根据我以前在这方面所做的基准测试,这种方法将为您提供最佳性能,并且非常简单。+1 - StriplingWarrior
这并不是完全相同的事情。首先,如果您的字符串不是常量,而是动态构建的,则必须有多个函数来持久化它们的字符串数据,然后就会涉及到并发问题和数据在字典中被更改的情况等等。 - Paul Sonier

3

一个Dictionary<string, object>就可以解决问题,你只需要将结果转换为stringFunc<string>即可。


点赞以抵消踩,也表示同意你的回答! :) - Paul Sonier
+1,同意对投票反对的行为感到不可思议。解决方案是完全有效的。 - JaredPar

2

将字典的值声明为对象。


谢谢,同意。看起来投票竞争有些失控了。 - Paul Sonier

1
创建一个具有字符串属性的对象。该对象具有智能功能,可以根据其构造函数返回字符串或调用您的函数获取字符串。然后将它们放入您的字典Dictionary中。
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

使用字典的示例

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接