Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于在字典中存储函数_C# - Fatal编程技术网

C# 关于在字典中存储函数

C# 关于在字典中存储函数,c#,C#,今天,我看到了这样的代码 Dictionary<string, Func<string[], int>> functions = new Dictionary<string, Func<string[], int>> { { "Foo", CountParameters } }; ... private static int CountParameters(string[] parameters) { return p

今天,我看到了这样的代码

Dictionary<string, Func<string[], int>> functions = 
    new Dictionary<string, Func<string[], int>>
{
    { "Foo", CountParameters }
};

...

private static int CountParameters(string[] parameters)
{
    return parameters.Length;
}

// etc


有人能帮我解释为什么要使用字典和性能吗?

为什么要使用字典?因为钥匙是不连续的。字符串键总是这样,但整数也可能出现这种情况

为什么使用字符串?因为需要或意外需要/使用了字符串索引。可能是数据源在字符串中运行,或者原始编码人员不理解枚举是一种东西

现在,性能是一个棘手的问题。首先,你应该阅读答案,以确保你真的需要答案

对于相等性检查,字符串位于奇数位置。默认情况下,类仅检查引用是否相等。如果两者都指向同一实例,则它们是相同的。字符串在包含值相等方面做了额外的工作。因此,如果引用相等失败,它将做额外的工作。所以它失败得很慢,但匹配得很快。有了钥匙,在你(如果有的话!)得到匹配之前,你会遇到很多失败。 另一方面,是.NET中的一个东西。因此,具有完全相同值的字符串最终往往是同一个实例

如果您担心密钥类型在比较方面太差,那么可以使用哈希表。它们的作用基本上与字典相同,只是它们还为每个键存储一个整数散列值。如果散列不匹配,您就知道它们不可能相同。如果它们确实匹配,则执行剩余的比较以避免任何哈希合并。因此,它往往失败得很快,但匹配速度较慢。唯一的缺点是您必须提供哈希函数,并且需要正确地编写它


编辑:正如朱哈尔所指出的,字典已经像哈希表一样工作,所以这种差异纯粹是学术上的。所有类都继承对象的默认哈希行为(它使用类似于类的引用相等,结构的基于反射的值相等),字符串有一个,但有很多警告。

from:“在标题中使用标记的唯一时间是当它们与标题的对话基调有机时。”我认为这段代码与性能几乎没有关系。要查看使用字典或普通集合存储和查找函数之间的性能差异,您需要使用成千上万或数百万个函数才能查看性能差异。很可能您没有那么多,所以这段代码更多的是关于易于实现和设计代码来解决特定问题的功能[“Foo”](新字符串[1]{“1”});将比简单地调用CountParameters(新字符串[1]{“1”})要慢。字典的目的是动态的。函数可以在运行时自由添加或删除,也可以指定任何名称。也许您看到的代码是由JavaScript程序员编写的。谢谢你的回答,但我想知道通过字典调用函数和通过函数调用函数之间的性能name@akurasu在字典中查找函数名比只编码函数名要慢几个数量级。这就是为什么只有在调用的函数不能硬编码的情况下才这样做。这就像比较对常量的访问和字典中的查找。这些甚至都不是可比的东西。C#中的字典是哈希表,它们使用键的散列来确定将值放入哪个bucket中。另外,
string
已经有了一个哈希算法,所以您只需要为自定义类型提供一个哈希算法,或者如果您想要一个特定类型的相等值。@juharr:Huh,很明显,哈希表类只用于COM互操作和类似的老式内容?我想使用hash是有意义的,因为GetHash是Object的函数。特别是对于预写类,它很有可能被编码掉:HashTable是字典的预泛型版本,类似于ArrayList是List的预泛型版本。我猜他们决定用不同的名字来区分他们。
functions["Foo"](new string[1] { "1" });
CountParameters(new string[1] { "1" })