1

我有一个程序需要支持“用户选项”以确定它将如何覆盖文件,用户可以从“选项”中进行选择,这会导致多种组合,从而难以编码所有可能的“IF”。 .. ELSE语句“,这个复杂的结果评估很难编码,它变得太长了,也让我疯狂!Logical Evaluator

我期待有某种“解析”,以评估在一个更快,更有机的方式的所有可能的结果,而不IF的长链来解决这个... ELSE块

Here是我在我的程序选择:

http://i.stack.imgur.com/Ggpbl.png

例如:用户已选择覆盖文件和拾取选项“FILE SIZE”和选定“> =”,作为该选项的标准,并且还选择了“文件的日期“加”< =“,并选择了”OR“,所有选项选择都会导致s例如“FILE> = x”或“FILE DATE < = x”。

考虑到屏幕截图上的选项,用户可以创建各种可能的逻辑选项,并使用“或”和“与”组合它们,也可以选择“>,<,> =,< = =,<>“。

这个小屏幕背后的复杂性是巨大的,我一直在研究如何解决这个问题,我听说过所谓的Lambda表达式和二叉树,但我不知道它是否适用于我的问题,我想至少有人指出我正确的方向,我甚至不知道如何正确分类我的“问题”时搜索答案:)

在此先感谢所有!

+0

你必须能够在运行时评估布尔表达式(特别是如果用户可以添加他自己的表达式) - > http://stackoverflow.com/questions/8476422/logic-evaluator-in-c-sharp-评估逻辑表达式 – fixagon

回答

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有枚举作为落实口罩或标志的推荐方式。

也就是说,您可以评估枚举值是否在整个枚举中定义了1或N个可能的标志。

相关问题