1

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

我希望通过某种“解析”来解决这个问题,以更快、更有机的方式评估所有可能的结果,而无需长链 IF...ELSE 块

是我的程序选项中的内容:

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

例如:用户选择覆盖文件并选择选项“文件大小”并选择“>=”作为此选项的条件,并且还选择了“文件日期”加上“<=”,并选择了“或”,选择的所有选项都会产生类似“FILE >= x”或“FILE DATE <= x”的结果。

鉴于屏幕截图上的选项,用户可以创建各种可能的逻辑选项并使用“OR”和“AND”组合它们,还可以选择“>”、“<、>=、<=、=、<> ”。

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

在此先感谢大家!

4

1 回答 1

1

我认为您的问题不会使用表达式树来解决。表达式树是功能表达式,可以在编译之前对其进行分析、改进或评估。当您想要创建一个流畅的配置时,这是一个很好的解决方案,该配置应该提供哪些属性提供开发人员决定的一些配置(还有其他用例,但这超出了您的问题):

config.EnableWhatever(x => x.HasWhatever)

您的选择应该围绕以下枚举[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 个可能的标志。

于 2014-06-18T11:53:15.030 回答