我有一些List<ObjectId>
名为“ids”的集合。我想允许用户为“ids”创建灵活的过滤器。
我想创建一个文本框,用户必须在其中写入过滤器字符串。例如:
item => item.ClassName == "Rectangle"
我需要这个表达式适用于“ids”上的每个项目。如何尝试解析它以进行验证?如何在我的代码中为每个“ids”项目运行它?
为什么不创建一个扩展 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
您可以利用动态 LINQ
它们是许多可用的lambda 表达式解析器。
使用以下逻辑来解析和执行基于文本框(Say txtFilter
)过滤器字符串。
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