我已经看到了一些关于SO re Java hashmaps及其O(1)查找时间的有趣声明.有人可以解释为什么会这样吗?除非这些哈希图与我买的任何哈希算法有很大的不同,否则必须始终存在包含冲突的数据集.
在这种情况下,查找将是O(n)而不是O(1).
有人可以解释他们是否是 O(1),如果是,他们如何实现这一目标?
如何创建一个可以存储函数的Dictionary?
谢谢.
我有大约30多个可以从用户执行的功能.我希望能够以这种方式执行该功能:
private void functionName(arg1, arg2, arg3)
{
// code
}
dictionaryName.add("doSomething", functionName);
private void interceptCommand(string command)
{
foreach ( var cmd in dictionaryName )
{
if ( cmd.Key.Equals(command) )
{
cmd.Value.Invoke();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,函数签名并不总是相同,因此具有不同数量的参数.
您是否发现以下C#代码清晰可辨?
private bool CanExecuteAdd(string parameter) {
return
this.Script == null ? false
: parameter == "Step" ? true
: parameter == "Element" ? this.ElementSelectedInLibrary != null && this.SelectedStep != null
: parameter == "Choice" ? this.SelectedElement != null
: parameter == "Jump" ? this.SelectedStep != null
: parameter == "Conditional jump" ? false
: false.Throw("Unknown Add parameter {0} in XAML.".F(parameter));
}
Run Code Online (Sandbox Code Playgroud)
其中Throw定义为:
public static T Throw<T>(this T ignored, string message) {
throw new Exception(message);
}
Run Code Online (Sandbox Code Playgroud)
我知道这不是惯用的C#.但是,你能在第一眼还是第二眼看到它?还是我偏离了太远?
我最近了解到开关语句在OOP中很糟糕,特别是罗伯特·马丁的"清洁代码"(第37-39页).
但请考虑这个场景:我正在编写一个游戏服务器,接收来自客户端的消息,其中包含一个表示玩家行为的整数,例如移动,攻击,挑选项目......等等,将有超过30种不同的动作.当我编写代码来处理这些消息时,没有想到我想到的解决方案,它将不得不在某处使用switch.如果不切换语句,我应该使用什么模式?
有人一直在谈论Enums一般违反清洁守则原则,所以我正在寻找人们最喜欢的Enum反模式和替代解决方案.
例如,我见过这样的代码:
switch(enumValue) {
case myEnum.Value1:
// ...
break;
case myEnum.Value2:
// ...
break;
}
Run Code Online (Sandbox Code Playgroud)
它比带有魔术字符串的switch语句更好一步,但这可能已经通过工厂,容器或其他模式更好地解决了.
甚至像这样的老派代码:
if(enumValue == myEnum.Value1) {
// ...
} else if (enumValue == myEnum.Value2) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
您对枚举有哪些其他反模式和更好的实现?