Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 枚举要筛选集合的表达式列表_C#_Linq_Lambda_Expression - Fatal编程技术网

C# 枚举要筛选集合的表达式列表

C# 枚举要筛选集合的表达式列表,c#,linq,lambda,expression,C#,Linq,Lambda,Expression,在这里,我正在突破我在c#和linq方面知识的极限,因此如果我完全不了解我的示例或对linq、c#、泛型类型、lambda表达式、设计模式等的理解,请原谅我 我有一个类包含两个集合,一个是要筛选的集合:IEnumerable,第二个是要筛选的表达式集合:IEnumerable 我正在努力理解一些事情: 如何为每个IInstagramFilter类设置表达式,然后在display()方法中调用它 每个IInstagramFilter类都会有一个lambda,用于过滤IEnumerable,但是由于

在这里,我正在突破我在c#和linq方面知识的极限,因此如果我完全不了解我的示例或对linq、c#、泛型类型、lambda表达式、设计模式等的理解,请原谅我

我有一个类包含两个集合,一个是要筛选的集合:
IEnumerable
,第二个是要筛选的表达式集合:
IEnumerable

我正在努力理解一些事情:

  • 如何为每个
    IInstagramFilter
    类设置表达式,然后在
    display()
    方法中调用它

  • 每个
    IInstagramFilter
    类都会有一个lambda,用于过滤
    IEnumerable
    ,但是由于filter类不知道
    IEnumerable
    我首先如何创建适当的lambda

  • 我认为这大致遵循了装饰者的模式,但也许有一个更好的设计,我不知道

  • 更新代码

    根据奥利弗的回答,这就是我现在所拥有的。在返回
    display()
    时,我发现使用
    时出错。其中(过滤器)

    无法从用法推断方法“
    System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)
    ”的类型参数。尝试显式指定类型参数

    公共类InstagramDisplay{
    公众不可计数的不稳定因素;
    公共列表InstagramFilter;
    公共InstagramDisplay(){
    instagramUsers=新列表();
    instagramFilters=新列表();
    }
    公共void addFilter(表达式过滤器){
    instagramFilters.Add(过滤器);
    }
    公共IEnumerable显示(){
    返回instagramFilters.SelectMany(filter=>InstagramMusers.Where(filter)).Distinct();//此行出错
    }
    }
    
    您必须决定是要执行某些操作还是要返回某些内容
    List.ForEach()
    对每个项目执行操作,但返回类型为void,不返回任何内容

    这个
    IInstagramFilter
    接口对我来说似乎是多余的。您可以像这样声明一个筛选器列表

    var userFilters = new List<Expression<Func<InstagramUser, bool>>>();
    userFilters.Add(u => u.Name.StartsWith("A"));
    userFilters.Add(u => u.Score >= 100);
    

    我同意这里不需要
    IInstagramFilter
    。除了
    SelectMany
    之外,他无法在过滤器集合上循环,将
    .Where(filter)
    附加到
    userSource
    。这将防止重复用户,还可以使用“and”而不是“@MikeC:将过滤器链接在一起是一个非常好的主意,因为这会使
    与众不同()
    多余。我不确定OP是否希望它们被or或AND(从他的例子中我假设为or)。而且很简单(只需将
    链接到哪里
    ,或者更难。@OlivierJacot Descombes这是一个很好的答案。我已经在上面发布了更新的代码,但我仍然在
    display()的返回语句中收到一个错误
    C#在推断类型参数方面很好,但在少数情况下它不能这样做。然后必须显式指定它们
    返回instagramFilters。选择many(filter=>InstagramMusers.Where(filter)).Distinct();
    @OlivierJacot Descombes我必须使用
    表达式吗
    ?我在执行
    时出错。Where(filter)
    但如果我将
    instagramFilters
    更改为`列表',那么我就可以编译了。我还不确定它是否真的过滤了列表。我想我知道在作为lambda传递给linq时必须使用表达式树,我错了吗?
    public class UserFilter : IInstagramFilter {
        public Expression<Func<T, bool>> filter<T>(IQueryable<T> source) {
            //return some expression - but how?
        }
    }
    
    public class InstagramDisplay {
    
        public IEnumerable<InstagramUser> instagramUsers;
        public List<Expression<Func<InstagramUser, bool>>> instagramFilters; 
    
        public InstagramDisplay() {
            instagramUsers = new List<InstagramUser>();
            instagramFilters = new List<Expression<Func<InstagramUser, bool>>>();
        }
    
        public void addFilter(Expression<Func<InstagramUser, bool>> filter) {
            instagramFilters.Add(filter);
        }
    
        public IEnumerable<InstagramUser> display() {
            return instagramFilters.SelectMany(filter => instagramUsers.Where(filter)).Distinct(); //error on this line
        }
    }
    
    var userFilters = new List<Expression<Func<InstagramUser, bool>>>();
    userFilters.Add(u => u.Name.StartsWith("A"));
    userFilters.Add(u => u.Score >= 100);
    
    IQueryable<InstagramUser> usersSource = ...; 
    // Or IEnumerable<InstagramUser> for LINQ to objects
    // if you drop the Expression<> part.
    
    var users = userFilters.SelectMany(f => usersSource.Where(f));
    
    var users = userFilters
        .SelectMany(f => usersSource.Where(f))
        .Distinct();