逻辑评估员

时间:2014-06-18 11:41:28

标签: c# .net binary-tree logical-operators expression-evaluation

我有一个程序需要支持"用户选项"为了确定它将如何覆盖文件,用户可以选择"选项"这可能导致几种组合,使得很难编写所有可能的" IF ... ELSE语句",这种复杂的结果评估很难编码,而且它太长了,也让我疯了!

我希望通过某种解析来解决这个问题"在没有长链IF ... ELSE块

的情况下,以更快,更有机的方式评估所有可能的结果

Here就是我在程序选项中的含义:

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

例如:用户已选择覆盖文件并选择了选项" FILE SIZE"并选择"> ="作为此选项的标准,并且还选择了" FILE DATE"加上"< =",然后选择" OR",所有选项选择将产生类似" FILE> = x"或者"文件日期< = x"。

鉴于屏幕截图上面的选项,用户可以创建各种可能的逻辑选项,并使用" OR"和" AND",并选择">,<,> =,< =,=,<>"。

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

提前感谢所有人!

1 个答案:

答案 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个可能的标志。