2014-06-18 102 views
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個可能的標誌。

相關問題