【问题标题】:boolean aggregation patterns in c#c#中的布尔聚合模式
【发布时间】:2011-05-08 19:51:03
【问题描述】:

我正在编写一个小查找应用程序,我有一个方便的控制台,可以快速查询缓存以进行完整性检查等。

get SomeField=Blue

这将从缓存中获取与该过滤器匹配的所有对象。

我可以应用更多过滤器

get SomeField=Blue && SomeOtherField < 5

如果我决定支持 () 的,这可能会变得更复杂

这里有什么好的模式?或者可能是一个可以为我获取字符串并对其进行标记的组件?

例如,我想将以下内容分解为过滤器子集

get ((field1=x || field1=y) && field2>x)

我能想到的唯一方法是正则表达式,而不是将子字符串传递给旨在创建特定过滤器的不同例程。 (即 AndEquals、OrEquals、AndGraterThan 等)

【问题讨论】:

    标签: c# .net boolean boolean-logic


    【解决方案1】:

    您不应该使用正则表达式来执行此操作,您需要一个成熟的解析器。看看 ANTLR。

    【讨论】:

      【解决方案2】:

      您可以在此处使用规范模式之类的东西。

      public interface ISpecification<T>
      {
          bool IsSatisfiedBy(T instance);
          ISpecification<T> And(ISpecification<T> specification);
          ISpecification<T> Or(ISpecification<T> specification);
          ISpecification<T> Not(ISpecification<T> specification);
      }
      

      完整的工作示例here

      【讨论】:

      • 这很有趣,但不确定它是如何应用的。我需要从长输入字符串中分解出表达式。这似乎是强类型谓词构建器
      • 恐怕你必须更精确地回答你原来的问题。正如 David 所暗示的那样,您似乎希望通过 DLR 或 C# 4 中的“动态”来研究某种动态语言功能。
      • 或者,当然,您可以疯狂地反思并尝试弄清楚您的用户想要什么。 ;)
      【解决方案3】:

      看看 IronPython。它很容易集成到 c# 应用程序中,并且已经支持所有标准的过程语言结构。我在游戏引擎中使用它来在调试时对场景状态进行实时调整。

      【讨论】:

      • 这是一个很好的建议。在大型 C# 应用程序中嵌入 IronPython 或 Ruby“特定领域语言”非常强大。
      • sigh.. 听起来不错,但我真的不想为这项任务学习一门新语言 :) 你有什么具体的结构可以让我快速利用吗?
      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2020-01-05
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2017-05-22
      • 2017-08-18
      • 2020-07-05
      相关资源
      最近更新 更多