在方法中使用Predicate <T>或Func <T>进行过滤

时间:2019-09-19 11:08:42

标签: c#

使用NET Core 2.2,我有以下内容:

public class User {
  public virtual IEnumerable<Claim> Claims { get; }
}

public class Claim { 
  public String Type { get; set; }
  public String Value { get; set; }
}

我有一个方法FindAllClaims的UserService:

public class UserService {

  public IEnumerable<Claim> FindAllClaims(/* Some Filter */) {
  }

}

我希望能够使用FindAllClaims方法过滤声明:

User user = this.User;

user.FindAllClaims(x => x.Type == "sub");

我不确定执行此操作的最佳方法...

Predicate<Claim>方法中使用Func<Claim>FindAllClaims吗?

我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可以使用

public IEnumerable<Claim> FindAllClaims(this IEnumerable<Claim> source, Expression<Predicate<Claim>> condition) {
return source.Where(condition)
  }

public IEnumerable<Claim> FindAllClaims(this IEnumerable<Claim> source, Expression<Func<Claim,bool>> condition) {
return source.Where(condition)
  }

答案 1 :(得分:3)

Predicate<T>委托定义为

    <sequence xmlns="http://ws.apache.org/ns/synapse" name="custom-sequence_name">

    <property xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
                xmlns:ns3="http://org.apache.synapse/xsd"
                name="accesstoken"
                value="put your token here"
                scope="transport"
                type="STRING"/>
    </sequence>

Func<T,TResult>委托定义为

public delegate bool Predicate<in T>(T obj);

因此,public delegate TResult Func<in T,out TResult>(T arg); 等效于Func<T, bool>

话虽这么说,我将在这个问题上使用Predicate<T>,因为它比Predicate更好地传达了论点的意图。

但是请注意,Func委托的TResult被标记为Func,因此,如果您使用引用类型,则可以返回实现{{ 1}}接口,或从out类派生。 有关更多信息,请阅读Variance in Generic Type Parameters文档中的Variance in Delegates段落。