Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Dictionary_Anonymous Function_Anonymous Delegates - Fatal编程技术网

C# 使用字典将工厂方法与匿名函数/委托映射以加快查找速度?

C# 使用字典将工厂方法与匿名函数/委托映射以加快查找速度?,c#,.net,dictionary,anonymous-function,anonymous-delegates,C#,.net,Dictionary,Anonymous Function,Anonymous Delegates,目前,我有一个静态工厂方法,如下所示: public static Book Create(BookCode code) { if (code == BookCode.Harry) return new Book(BookResource.Harry); if (code == BookCode.Julian) return new Book(BookResource.Julian); // etc. } private static readonly Dictiona

目前,我有一个静态工厂方法,如下所示:

public static Book Create(BookCode code) {
    if (code == BookCode.Harry) return new Book(BookResource.Harry);
    if (code == BookCode.Julian) return new Book(BookResource.Julian);
    // etc.
}
private static readonly Dictionary<BookCode, BookResource> codeResources = new Dictionary<BookCode, BookResource>();

...

codeResources[BookCode.Harry] = BookResource.Harry;

public static Book Create(BookCode code) {
    return new Book(codeResources[code]);
}
我不以任何方式缓存它们的原因是BookResource对区域性敏感,在调用之间可能会发生变化。对区域性的更改需要反映在返回的图书对象中

执行这些if语句可能是一个速度瓶颈。但是,如果我们将书本代码映射到匿名函数/委托,该怎么办?如下所示:

delegate Book Create();
private static Dictionary<BookCode, Delegate> ctorsByCode = new Dictionary<BookCode, Delegate>();
// Set the following somewhere
// not working!
ctorsByCode[BookCode.Harry] = Create () => { return new Book(BookResource.Harry); }
// not working!
ctorsByCode[BookCode.Julian] = Create () => { return new Book(BookResource.Julian); } 
public static Book Create(BookCode code) {
    return (Book)ctorsByCode[code].DynamicInvoke(null);
}
像这样:

private static readonly Dictionary<BookCode, Func<Book>> ctorsByCode = new Dictionary<BookCode, Func<Book>>();

...

ctorsByCode[BookCode.Harry] = () => new Book(BookResource.Harry);

public static Book Create(BookCode code) {
    return ctorsByCode[code]();
}

我建议您将词典改为包含
BookResource
s,如下所示:

public static Book Create(BookCode code) {
    if (code == BookCode.Harry) return new Book(BookResource.Harry);
    if (code == BookCode.Julian) return new Book(BookResource.Julian);
    // etc.
}
private static readonly Dictionary<BookCode, BookResource> codeResources = new Dictionary<BookCode, BookResource>();

...

codeResources[BookCode.Harry] = BookResource.Harry;

public static Book Create(BookCode code) {
    return new Book(codeResources[code]);
}
private static readonly Dictionary codeResources=new Dictionary();
...
codeResources[BookCode.Harry]=BookResource.Harry;
公共静态图书创建(图书代码){
归还新书(codeResources[code]);
}
像这样:

private static readonly Dictionary<BookCode, Func<Book>> ctorsByCode = new Dictionary<BookCode, Func<Book>>();

...

ctorsByCode[BookCode.Harry] = () => new Book(BookResource.Harry);

public static Book Create(BookCode code) {
    return ctorsByCode[code]();
}

我建议您将词典改为包含
BookResource
s,如下所示:

public static Book Create(BookCode code) {
    if (code == BookCode.Harry) return new Book(BookResource.Harry);
    if (code == BookCode.Julian) return new Book(BookResource.Julian);
    // etc.
}
private static readonly Dictionary<BookCode, BookResource> codeResources = new Dictionary<BookCode, BookResource>();

...

codeResources[BookCode.Harry] = BookResource.Harry;

public static Book Create(BookCode code) {
    return new Book(codeResources[code]);
}
private static readonly Dictionary codeResources=new Dictionary();
...
codeResources[BookCode.Harry]=BookResource.Harry;
公共静态图书创建(图书代码){
归还新书(codeResources[code]);
}

坦率地说,您可能不会注意到两者之间的性能差异。但是,如果您要使用“功能”版本,我不会只使用一般的
委托
,而是传递您刚刚创建的委托。这就是您的(更简单的)代码:

委托书创建();
私有静态字典ctorsByCode
=新字典();
ctorsByCode[BookCode.Harry]=()=>新书(BookResource.Harry);
ctorsByCode[BookCode.Julian]=()=>新书(BookResource.Julian);
公共静态图书创建(图书代码){
返回ctorsByCode[code]();
}

坦率地说,您可能不会注意到两者之间的性能差异。但是,如果您要使用“功能”版本,我不会只使用一般的
委托
,而是传递您刚刚创建的委托。这就是您的(更简单的)代码:

委托书创建();
私有静态字典ctorsByCode
=新字典();
ctorsByCode[BookCode.Harry]=()=>新书(BookResource.Harry);
ctorsByCode[BookCode.Julian]=()=>新书(BookResource.Julian);
公共静态图书创建(图书代码){
返回ctorsByCode[code]();
}

伙计,你为什么把事情弄得这么复杂?在你的问题和随后的答案中,有两种方法可以避免这种混乱

  • bookResourceEnum=(BookResource)Enum.Parse(typeof(BookResource),bookCode)

    归还新书(bookResourceEnum)

  • 或者更好的方法是,让静态工厂方法创建accept BookResource而不是BookCode,并让客户机担心从代码到枚举的转换,以便 没有人可以传入无法映射到BookResource的代码


  • 说真的,如果你给我写了一个有50个“如果”的代码,或者更糟的是,还有50个“代表”,我们会进行一次“对话”。当你不确定这是你的瓶颈时,尽量避免过早优化(如果有)。可读性和可维护性应该放在首位。

    伙计,你为什么把事情弄得这么复杂?在你的问题和随后的答案中,有两种方法可以避免这种混乱

  • bookResourceEnum=(BookResource)Enum.Parse(typeof(BookResource),bookCode)

    归还新书(bookResourceEnum)

  • 或者更好的方法是,让静态工厂方法创建accept BookResource而不是BookCode,并让客户机担心从代码到枚举的转换,以便 没有人可以传入无法映射到BookResource的代码


  • 说真的,如果你给我写了一个有50个“如果”的代码,或者更糟的是,还有50个“代表”,我们会进行一次“对话”。当你不确定这是你的瓶颈时,尽量避免过早优化(如果有)。可读性和可维护性应放在首位。

    您是否可以招聘?一小时收费多少这是一个很好的解决方案。我喜欢它比凯尔特更紧凑的样子。另一种解决方案实际上非常好。我用上述两种方法得到了“委托”系统。操作“不接受0个参数”。@randomguy:我忘了提到
    字典
    也应该声明为
    只读
    。(此声明影响变量,而不是引用;它意味着您无法编写
    codeResources=…
    。您是否可以招聘?每小时收费多少?:D很棒的解决方案。我喜欢它比Keltex更紧凑的方式。替代解决方案实际上非常好。我正在对于上述两种方法,“委托”System.Action“不接受0个参数”。@randomguy:我忘了提到
    字典
    也应该声明为
    只读
    。(此声明影响变量,而不是引用;它意味着您无法编写
    codeResources=…
    。很好,先生。将接受SLaks答案,但给了您一个upboat。很好,先生。将接受SLaks答案,但给了您一个upboat。嘿!感谢您的输入。BookResource是从.re自动生成的区域性敏感资源类。)sx文件,因此按照您建议的方式使用它是没有意义的。或者至少对我来说没有意义。我同意最后几点,但是,我确实觉得委托方法会非常漂亮..如果开销不是那么大的话。嘿!感谢您的输入。BookResource是从.resx文件自动生成的区域性敏感资源类,因此按照你建议的方式使用它是没有意义的。或者至少对我来说没有意义。我同意最后的几点,但是,我确实觉得委托方法会非常好。如果开销不是那么大的话。