2010-11-12 32 views
3

J'écris une petite application de recherche, où j'ai une console très pratique pour les requêtes rapides contre un cache pour les contrôles de santé d'esprit etc ..modèles d'agrégation booléennes dans C#

ie

get SomeField=Blue 

cette volonté que se tous les objets du cache correspondant à ce filtre.

je peux appliquer plusieurs filtres

get SomeField=Blue && SomeOtherField < 5 

cela peut devenir plus complexe si je décide de soutenir() de

ce qui est un bon modèle à utiliser ici? ou peut-être un composant qui peut prendre une chaîne et la marquer pour moi?

par exemple, je veux décomposer les éléments suivants dans sous-ensemble de filtres

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

la seule façon que je peux penser à le faire, est regex, et que passer à différentes routines sous-chaînes destinées à créer un filtre spécifique. (c'est-à-dire AndEquals, OrEquals, AndGraterThan etc.)

Répondre

2

Vous ne devriez pas faire cela avec une expression régulière, vous avez besoin d'un analyseur complet. Jetez un oeil à ANTLR.

3

Jetez un oeil à IronPython. Il est facile à intégrer dans une application C# et prend déjà en charge toutes les constructions de langage procédural standard. Je l'utilise dans un moteur de jeu pour effectuer des réglages en temps réel à l'état de la scène pendant le débogage.

+0

Ceci est une bonne recommandation. L'incorporation de "langages spécifiques au domaine" IronPython ou Ruby dans une application C# plus grande est assez puissante. – RationalGeek

+0

soupir .. sonne bien, mais je ne cherchais pas à apprendre une nouvelle langue pour cette tâche :) est-il une construction spécifique que vous avez en tête que je peux rapidement tirer parti? –

1

Vous pouvez utiliser quelque chose comme le modèle de spécification ici.

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); 
} 

exemple travaillant à plein here

+0

c'est intéressant mais je ne sais pas comment ça s'applique .. j'ai besoin de sortir des expressions d'une longue chaîne d'entrée .. cela semble être fortement typé créateur de prédicat –

+0

Je crains que vous deviez être plus précis avec votre original question alors. Comme David a fait allusion à, il semble que vous voudrez peut-être regarder dans un langage dynamique via le DLR ou "dynamique" dans C# 4. –

+0

Ou bien sûr, vous pouvez devenir fou de réflexion et essayer de comprendre ce que votre utilisateur veut . ;) –