gpt4 book ai didi

c# - 仅根据案例值调用方法的开关的替代方法

转载 作者:行者123 更新时间:2023-11-30 12:47:22 26 4
gpt4 key购买 nike

有没有可能用更短、更易读的代码编写下一个开关?

switch (SomeValue)
{
case "001": return DoMethod1(); break;
case "002": return DoMethod2(); break;
//etc..
}

我在某种程度上是这样想的

Dictionary<string, Func<int>> MethodsByValue = new Dictionary<string, Func<int>>()
{
{ "001", DoMethod1 },
{ "002", DoMethod2 },
}

通过做来调用它

return MethodsByValue[SomeValue]();

但这可能吗?还是我在想开箱即用的方法。我找不到这样的任何内容,但话又说回来,如果可能的话,我不知道关键字。

编辑:回答 Lasse V. Karlsen 的要求:

这就是代码在我的项目中的样子。在某些地方更改了名称,因为原来的名称并不重要,因为它是我的母语。

public string GetRecord420(Dictionary<DataClass, object> dictionaryName)
{
// some code here
}

public string GetRecord421(Dictionary<DataClass, object> dictionaryName)
{
// some code here
}

//(Temperary) solution with the switch statement in a wrapper:
public string GetRecordByString(string s, Dictionary<DataClass, object> dictionaryName)
{
switch (s)
{
case "320": return GetRecord420(dictionaryName);
case "321": return GetRecord421(dictionaryName);
default: return String.Empty;
}
}

//How I hoped it could be, with a mapping dictionary.
public Dictionary<string, Func<string, Dictionary<DataClass, object>>> MethodByString =
new Dictionary<string, Func<string, Dictionary<DataClass, object>>>()
{
{ "320", GetRecord420 },
{ "321", GetRecord421 },
}

DataClass是一个Entity类,存储了一些列数据(列名、列类型等)。

我尝试了字典部分,但它给了我错误:无法从方法组转换为 System.Func<...>。

更改为 () => GetRecord420 时出现错误:无法将 lambda 转换为委托(delegate)类型 System.Func<...> 因为 block 中的某些返回类型无法隐式转换为委托(delegate)返回类型。

最佳答案

一定是你的方法定义有误,

class Program
{
static void Main()
{
var methods = new Dictionary<string, Func<int>>
{
{ "001", DoMethod1 }
};
}

static int DoMethod1()
{
return 1;
}
}

是完全有效的语法。

但是,出于 1 个引人注目的和 1 个主观原因,这并不比 switch 好。

如果您要与常量或文字进行比较,那么您应该使用 switch。这使编译器无需额外分析即可执行编译时优化。

更主观地说,字典/查找方法并没有缩短,而且我发现它更难阅读。但是,在您的比较项在运行时发生变化的情况下,它会很有用。

如果你想避免重写 switch 将它分解成一个函数。说,

Func<int> MethodsByValue(string value)
{
switch(value)
{
case "001":
return DoMethod1;

default:
return DoMethod2;
}
}

无论哪种方式,

与其使用一些任意字符串来枚举您的方法,不如使用enum?然后您将获得额外的性能和可读性优势。

关于c# - 仅根据案例值调用方法的开关的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17144872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com