我有一个程序需要支持"用户选项"为了确定它将如何覆盖文件,用户可以选择"选项"这可能导致几种组合,使得很难编写所有可能的" IF ... ELSE语句",这种复杂的结果评估很难编码,而且它太长了,也让我疯了!
我希望通过某种解析来解决这个问题"在没有长链IF ... ELSE块
的情况下,以更快,更有机的方式评估所有可能的结果Here就是我在程序选项中的含义:
例如:用户已选择覆盖文件并选择了选项" FILE SIZE"并选择"> ="作为此选项的标准,并且还选择了" FILE DATE"加上"< =",然后选择" OR",所有选项选择将产生类似" FILE> = x"或者"文件日期< = x"。
鉴于屏幕截图上面的选项,用户可以创建各种可能的逻辑选项,并使用" OR"和" AND",并选择">,<,> =,< =,=,<>"。
这个小屏幕背后的复杂性是巨大的,我一直在研究如何解决这个问题,我听说过Lambda表达式和二叉树的事情,但我不知道它是否适用于我的问题,我会至少有人指出我正确的方向,我甚至不知道如何正确地分类我的问题"当谷歌搜索答案时:)
提前感谢所有人!
答案 0 :(得分:1)
我认为您的问题不会使用表达式树解决。表达式树是功能表达式,可以在编译之前进行分析,改进或评估。当你想要创建一个流畅的配置时,这是一个很好的解决方案,它应该提供哪些属性提供开发人员决定的一些配置(还有其他用例,但这超出了你的问题):
config.EnableWhatever(x => x.HasWhatever)
您的选择应该是enumerations with [FlagsAttribute]
:
[Flags]
public enum FileSizeOptions
{
None = 0,
IfFileSizeIsGreaterThan = 1,
IfFileSizeIsLowerThan = 2,
OtherOption = 4,
All = IfFileSizeIsGreaterThan | IfFileSizeIsLowerThan | OtherOptions
}
FileSizeOptions options = FileSizeOptions.IfFileSizeIsGreaterThan | FileSizeOptions.OtherOption;
if(options.HasFlag(FileSizeOptions.All))
{
// Do stuff
} else if(options.HasFlag(FileSizeOptions.IfFileSizeIsGreaterThan))
{
// Do stuff
} // and so on...
我的意思是,你应该使用掩码而不是布尔值,并且.NET有 enums 作为实现掩码或标志的推荐方法。
也就是说,您可以评估枚举值是否在整个枚举中定义了1个或N个可能的标志。