C# 使用谓词<;T>;或函数<;T>;在方法中进行过滤

C# 使用谓词<;T>;或函数<;T>;在方法中进行过滤,c#,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方法中过滤索赔: User user = this.User;

使用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
方法中过滤索赔:

User user = this.User;

user.FindAllClaims(x => x.Type == "sub");
我不知道最好的方法是什么

FindAllClaims
方法中使用
谓词
Func

我该怎么做?

您可以使用

public IEnumerable FindAllClaims(此IEnumerable源、表达式条件){
返回源。其中(条件)
}

public IEnumerable FindAllClaims(此IEnumerable源、表达式条件){
返回源。其中(条件)
}
该委托被定义为

public delegate bool Predicate<in T>(T obj);
public delegate TResult Func<in T,out TResult>(T arg);
公共委托布尔谓词(T obj);
委托被定义为

public delegate bool Predicate<in T>(T obj);
public delegate TResult Func<in T,out TResult>(T arg);
public委托TResult Func(T参数);
因此,
Func
等价于
谓词

话虽如此,在这一点上,我将使用
谓词
,因为它比
Func
更好地表达了参数的意图

但是,请注意,
Func
委托的
TResult
标记为
out
,因此如果您使用的是引用类型,则可以返回实现
TResult
接口或从
TResult
类派生的任何内容。
有关详细信息,请阅读文档中的段落。

FYI:当您希望函数的委托可以接受参数也可以不接受参数并返回值时,将使用谓词==func。e、 g.当您需要Func的专用版本时,可以使用Select from LINQ谓词,该版本根据一组条件计算值并返回布尔结果(匹配为true,否则为false),以便更好地使用谓词。