1

List<ObjectId>「ids」と呼ばれるコレクションがあります。ユーザーが「ID」の柔軟なフィルターを作成できるようにしたいと考えています。

ユーザーがフィルター文字列を書き込む必要があるテキストボックスを作成したいと思います。例えば:

item => item.ClassName == "Rectangle"

この式は、「ids」の各アイテムに適用する必要があります。検証のために解析するにはどうすればよいですか? 「ids」アイテムごとにコードで実行するにはどうすればよいですか?

4

3 に答える 3

1

List を拡張するクラスを作成してみたら、次のような get メソッドを作成できます。

public class ObjectIdCollection : List<ObjectId>
{
    public ObjectIdCollection() { }
    public ObjectId this[string classname]
    {
        get
        {
            foreach(ObjectId id in this) if(id.ClassName == classname) return id;
            return null;
        }
    }
}

これは、指定されたクラス名を持つ最初の Id を返すか、何も見つからない場合は null を返します。

于 2012-10-15T17:24:58.527 に答える
1

Dynamic LINQを利用できます

于 2012-10-15T17:27:42.727 に答える
0

それらは利用可能な多くのラムダ式パーサーです。

txtFilter以下のロジックを使用して、テキストボックス(Say )フィルター文字列に基づいて解析および実行します。

var ids = new List<ObjectId> 
             { 
                new ObjectId { ClassName = "Rectangle1", ID = 1 }, 
                new ObjectId { ClassName = "Rectangle2", ID = 2 } 
             };

string code = txtFilter.Text; (Ex: "item => item.ClassName == \"Rectangle1\"" ;)

Func<ObjectId, bool> func = ExpressionParser.Compile<Func<ObjectId, bool>>(code);      

ids.ForEach(obejctId => 
        {
            Console.WriteLine(func.Invoke(obejctId));
        });

出力は

  True
  False
于 2012-10-15T19:41:53.573 に答える