【发布时间】:2016-03-24 14:24:58
【问题描述】:
目前正在用 C# 做一个大学项目,其中包括将一种形式的代码转换为另一种形式的代码,这涉及从许多可用的方法中选择合适的方法/函数。这里的问题是,要使用任何模式匹配技术而不是使用许多 IF ELSE 语句来实现这一点。
现在我已经使用嵌套的 IF ELSE 语句实现了这一点,它填充了整个程序并且在完成时看起来像幼稚的代码。
当前实现:--
输入:
//stored in list<string>
get(3 int) //type1
get(int:a,b,c) //type2
get(name) //type3
//list passed to ProcessGET method
使用 if else :
public string ProcessGET(List<string> inputData)
{
foreach(var item in inputData)
{
if (inputData.item.Split('(')[1].Split(')')[0].Contains(':'))
{
return Type2 result;
}
else if (!inputData.item.Split('(')[1].Split(')')[0].Contains(':') && Convert.ToInt32(inputData.item.Split('(')[1].Split(')')[0].Split(' ')[0])>0)
{
return Type1 result;
}
else
{
return Type3 result;
}
}
}
我希望它是这样的,
/stored in list<string>
get(3 int) //type1
get(int:a,b,c) //type2
get(name) //type3
//list passed to ProcessGET method
public string ProcessGET(List<string> inputData)
{
foreach(var itm in inputData)
{
// call appropriate method(itm) based on type using some pattern matching techniques
}
}
string Method1(var data)
{
return result for type1;
}
string Method2(var data)
{
return result for type2;
}
string Method3(var data)
{
return result for type3;
}
通常情况下,我的程序主要针对各种类型的输入关键字(如“get”、“output”、“declare”等)执行此类工作……其中 Get 被转换为 Scanf 语句,输出为 printf 语句等等在。 在这种情况下,如果我使用 IF ELSE,我的项目充满了 If else 语句。
因为我刚开始学习 C#,我不知道这样的东西是否存在(谷歌搜索但没有找到我想要的东西),所以任何关于这个问题的帮助将非常有帮助(有用)进一步发展。
非常感谢。
【问题讨论】:
-
你能告诉我们你得到的实际代码吗?
function for Type3(var data)不是有效的 C#。我也很难理解get(3 int)的意思。你是说重载吗? -
dynamic关键字作为返回类型允许您返回任意值。然后,您可以使用typeof运算符检查返回的内容的类型,也许可以尝试深入研究该材料,看看是否可以在您的情况下使用它。 (public dynamic ProcessGET()可以毫无问题地返回Type1、Type2和Type3对象。) -
@Rob - 那些 get() 输入法是我自己的自定义语法。
-
@MaximilianGerhardt - 对不起,如果我的意思不正确。实际上我总是从所有方法返回字符串值。
-
转换代码的更好方法是构建(或使用现有的)解析器,它会在内存中构建一个抽象语法树,然后对其进行转换使用语法树上的 '访问者模式' 到选择的输出。这可能超出了这个项目,但值得阅读这些概念以了解解决问题的更好方法。
标签: c# asp.net .net pattern-matching