SORU
4 Mayıs 2009, PAZARTESİ


Nasıl eşdeğer İfade Ağaç bir Dize dönüştürmek için?

Bu orijinal problemin daha basit bir versiyonu.

Bir sınıf İnsan aradım:

public class Person {
  public string Name { get; set; }
  public int Age { get; set; }
  public int Weight { get; set; }
  public DateTime FavouriteDay { get; set; }
}

...ve sağlar bir örneği de ki:

var bob = new Person {
  Name = "Bob",
  Age = 30,
  Weight = 213,
  FavouriteDay = '1/1/2000'
}

Bir olarak şunları yazmak istiyorumstringbenim favori metin editörü....

(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3

Bu dize ve bir nesne örneği ele alalım ve ya - yani bir İşlev değerlendirme<Kişinin, bool TRUE YANLIŞ bir^ değerlendirmek istiyorum . nesne örneği.

Şu anki düşüncelerim:

  1. ANTLR temel dilbilgisi temel Karşılaştırma ve Mantıksal Operatörler için destek uygulamak. Visual Basic öncelik ve featureset bazılarını burada kopyalama düşünüyorum: http://msdn.microsoft.com/en-us/library/fw84t893(VS.80).aspx
  2. ANTLR sağlanan bir dize uygun bir AST oluşturun.
  3. AST yürüyüş ve dinamik olarak İşlev< oluşturmak için Predicate Builder çerçeve kullanmak;Kişi, bool>
  4. Gerekli Kişi örneğine karşı yüklem değerlendirin

Benim sorum tamamen overbaked var? herhangi bir alternatif?


DÜZENLE: Seçilen Çözüm

Dinamik Etmeniz Kütüphane kullanmak için, özellikle Dinamik Sorgu sınıf LİNQSamples verilen karar verdim.

Aşağıdaki kodu için:

using System;
using System.Linq.Expressions;
using System.Linq.Dynamic;

namespace ExpressionParser
{
  class Program
  {
    public class Person
    {
      public string Name { get; set; }
      public int Age { get; set; }
      public int Weight { get; set; }
      public DateTime FavouriteDay { get; set; }
    }

    static void Main()
    {
      const string exp = @"(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3";
      var p = Expression.Parameter(typeof(Person), "Person");
      var e = DynamicExpression.ParseLambda(new[] { p }, null, exp);
      var bob = new Person
      {
        Name = "Bob",
        Age = 30,
        Weight = 213,
        FavouriteDay = new DateTime(2000,1,1)
      };

      var result = e.Compile().DynamicInvoke(bob);
      Console.WriteLine(result);
      Console.ReadKey();
    }
  }
}

Sonuç tipi Sistemi.Boolean, ve bu durumda DOĞRUDUR.

Marc Gravell için çok teşekkürler.

CEVAP
4 Mayıs 2009, PAZARTESİ


dynamic linq library yardım istiyorsunuz? Özellikle, Where bir madde olarak düşünüyorum. Gerekirse, dizi/bir liste içinde sadece .Where(string) aramayı bırak! yani

var people = new List<Person> { person };
int match = people.Where(filter).Any();

Değilse, yazılı bir çözümleyici (kullanarak Expression başlık altında) değil, oldukça yıpratıcı - ben de bir tane yazdım benzer (her ne kadar ben olduğunu sanmıyorum kaynak) trenim gidip hemen önce xmas...

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 2ndfloor91

    2ndfloor91

    17 Kasım 2007
  • Atlantic Records

    Atlantic Rec

    15 Aralık 2006
  • MyTiredBones

    MyTiredBones

    2 Temmuz 2013