当前位置: 首页 > 知识库问答 >
问题:

如何基于强加类型的谓词集合过滤对象?

商和颂
2023-03-14

我有一种情况,我想根据强加给其特定类型的谓词集合来过滤对象:这可以通过预编译的ExpressionTrees来完成吗?

class A
{
   public int Value {get;set;}
}
class B
{
  public string Name {get;set;}
  public bool IsMajor{get;set;}
}


Dictionary<Type,IEnumerable<Predicate<[object casted to type]>> typePredicateMap=new Dictionary<Type,Predicate<[object casted to type]>>{
   {typeof(A),new List<Predicate<[object casted to A]> { x=>x.Value >100,x=>x.Value<200 }},
   {typeof(B),new List<Predicate<[object casted to B]> { x=>x.Name!="johhnny",x=>x.IsMajor==true }}
}

我说上面的对象转换为Type,因为我希望我的谓词基于该特定类型...

public static bool MeetsCriteria(object data)
{
    Type type=typeof(data);
    IEnumerable<Predicate<object>predicates=typePredicateMap[type];
    bool isValid=true;
    foreach(var predicate in predicates)
    {
        isValid&=predicate(data);  //
    }
    return isValid;
}

共有1个答案

冯翔
2023-03-14

主要问题是,由于我们要动态选择要调用的谓词,因此它们必须是谓词类型。

在实践中,这意味着如果您有一个类A和类B: A,您可以使用谓词

我想这是一种冗长的方式,你只需要使用谓词

我不相信你的要求可以用表达式树来解决,因为类型的问题仍然存在,但是嘿,也许有人会证明我错了。

 类似资料:
  • 问题内容: 我想做类似的事情: Python的标准库中是否有类似行为? 我知道在这里自己动手很容易,但是我正在寻找一种更标准的方法。 问题答案: 您可以使用filter方法: 或列表理解: 要查找单个元素,可以尝试: 尽管如果没有匹配项将引发异常,因此您可能希望将其包装在try / catch中。方括号()使之成为生成器表达式,而不是列表理解。 就我个人而言,尽管我只是使用常规的过滤器/理解并采用

  • 问题内容: 我有一个对象集合,我想将其划分为两个集合,其中一个通过谓词,而其中一个失败谓词。我希望有一个Guava方法可以做到这一点,但是最接近的是filter,它没有给我其他的集合。 我会想像一下方法的签名,就像这样: 我意识到这对自己进行编码非常快,但是我正在寻找一种可以满足我需要的现有库方法。 问题答案: 使用番石榴的。 这是一个示例,该示例将单词列表分为两部分:长度大于3的单词和不大于3的

  • 问题内容: 我正在尝试过滤一个类的实例数组。我想要一个由类属性之一过滤的新数组。Swift过滤器在此用例中的工作方式无法完全理解。 问题答案: 这应该工作… 您可能需要使您的枚举符合等式才能进行此比较。 $ 0是一个未命名的参数,您也可以这样做。 编辑:我刚刚测试了它,它的工作而不会使枚举符合等于。我认为您只需要在枚举带有参数时执行此操作。

  • 使用java stream,我有一个ClassA列表,应用于流以进行过滤,所以使用List。stream()。过滤器(谓词)。这样,谓词就需要ClassA的谓词来应用,但我真的想要String的谓词,因为ClassA。Field1是字符串类型。因此,与其让谓词包含f- 缺少的链接是什么,我需要如何转换流才能做到这一点? 对于其他上下文,在过滤之后,我需要从过滤列表中提取第二个字段,因此目标是拥有C

  • 我有一个淡褐色IMAP看起来像 在val1,val2上建立索引我正在尝试获取say