2

我正在尝试通过 a 枚举List<Func<InstagramUser,bool>>来过滤List<InstagramUser>. 我的代码编译,但只返回整个列表,未过滤,当display()被调用。

我的问题是,保存一组 lambda 表达式然后可以用来过滤另一个集合的正确方法是什么?

public class InstagramDisplay {
    public IList<InstagramUser> instagramUsers;
    public IList<Func<InstagramUser, bool>> instagramFilters; 

    public InstagramDisplay() {
        instagramUsers = new List<InstagramUser>();
        instagramFilters = new List<Func<InstagramUser, bool>>();
    }

    public void addFilter(Func<InstagramUser, bool> filter, object filterValue) {
        if ((int)(filterValue ?? 0) > 0)
            instagramFilters.Add(filter);
    }

    public IEnumerable<InstagramUser> display() { //filter not working
        instagramFilters.ToList().ForEach(filter => instagramUsers.Where(filter));
        return instagramUsers;
    }
}

调用 - 只返回完整的集合,未过滤:

InstagramDisplay instagramDisplay = new InstagramDisplay();
instagramDisplay.instagramUsers = (List<InstagramUser>)context.Cache[CACHE_KEY];
instagramDisplay.addFilter(u => u.id == instagramId, instagramId);
context.Response.Write(javascriptSerializer.Serialize(instagramDisplay.display());
4

2 回答 2

6

如果您想包含与所有过滤器匹配的用户(AND比较):

instagramUsers.Where(u => instagramFilters.All(f => f(u)));

如果要包含匹配 1 个或多个过滤器的用户,请更改上述语句中的Allby Any

于 2012-08-24T18:39:50.467 回答
2

问题是您的ForEach语句实际上并没有使用或存储Where您正在运行的方法的结果。您需要构建一个结果IEnumerable<T>,并对其进行系列过滤。

你可以这样写:

public IEnumerable<InstagramUser> display() { 
    IEnumerable<InstagramUser> users = instagramUsers;
    foreach(var filter in instagramFilters)
        users = users.Where(filter);
    return users;
}
于 2012-08-24T18:38:55.287 回答