gpt4 book ai didi

c# - 将对象属性与规则匹配的算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:08 25 4
gpt4 key购买 nike

抱歉标题不明确。解释如下:

我有一个类型的对象 Foo 具有属性 a、b、c、d。假设这些属性(字符串/ bool 类型)中的每一个都可以有单独的 3 个唯一值(a 有 1、2、3;b 有 11、12、13 等等)。

我有一组规则,我想根据这些规则来匹配 Foo 对象列表。规则可以具有一个或多个具有选定值的属性。例子:规则 1:a=1规则 2:b=12 和 a=2

我想知道什么是使规则匹配的最佳方式(基于 C#/Haskell 的解决方案会更好,尽管只是对算法的解释也很好)。

我提到了 C#,因为如果有任何可能的方法我们可以使用 LINQ 进行此类匹配,我会很感兴趣。 Haskell 被称为函数式语言的代理,因此是一种递归的、无分支的方法。

我目前正在使用字典来构建规则,然后使用反射来完成匹配。我最喜欢当前解决方案的一点是,如果我们需要添加一个新属性,那么它很容易,而且由于分支较少,代码非常容易理解。

添加示例以更加清晰

我们有一个具有以下属性的动物对象列表

Object:Animal
Properties: Color, LivingEnvironment, Place, Mammal (all properties are of type string)

数据:

Animal1 : Red, Water, Arctic, No
Animal2 : Black, Land, Asia, No
Animal3 : Blue, Land, UK, Yes

规则

Rule1 : Color=Red And LivingEnvironment=Land
Rule2 : Color=Red And LivingEnvironment=Water
Rule3 : COlor=Blue And Place=UK And Mammal=Yes

规则可从用户界面配置,因此在编译时未知。用户可能会出现并将规则 3 更改为新定义

Rule3 : Color=Blue And PLace=UK

我希望这能澄清之前造成的一些困惑。

最佳答案

规则只是一个函数:

type Rule = Foo -> Bool

这是一个制定规则的函数:

(=:=) :: Eq a => (Foo -> a) -> a -> Rule
f =:= x = \foo -> f foo == x

(例如 a =:= 1)

这里有几个组合规则的函数:

allRules, anyRules :: [Rule] -> Rule
allRules rules foo = all ($ foo) rules
anyRule rules foo = any ($ foo) rules

(例如 allRules [b =:= 12, a =:= 2])

使用标准的filter 函数来过滤您的[Foo]


您想从配置文件中读取您的规则。我假设您通过读取/解析您的配置获得了字符串对列表。

让我们从将一对字符串转换为规则的函数开始:

readRule :: String -> String -> Maybe Rule
readRule = fieldName requiredValue = do
constructRule <- lookup fieldName ruleDefs
constructRule requiredValue

ruleDefs :: [(String, String -> Maybe Rule)] -- should be a Map irl

现在让我们编写一个辅助函数来在 ruleDefs 中生成条目:

ruleEntry :: (Read a, Eq a) => String -> (Foo -> a) -> String -> Maybe Rule
ruleEntry name project = (name, constructRule) where
constructRule requiredValue
= case filter (null . snd) (reads requiredValue) of
[(value, _)] -> Just (value ==)
_ -> Nothing

除了辅助函数之外,您还可以手动编写 ruleDefs:

ruleDefs = [
ruleEntry "alpha" alpha,
ruleEntry "beta" beta,
ruleEntry "gamma" gamma,
ruleEntry "delta" delta]

此结构适用于字段(例如 data Foo = Foo { alpha::Int, beta::Int } 中的 alphabeta ) 和计算字段(例如 delta foo = alpha foo - beta foo)。我将展示一些无需重复输入即可构建 ruleDefs 的技术,它们都将使用 Template Haskell。

(更多内容。)

关于c# - 将对象属性与规则匹配的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16621804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com