我试图枚举一个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());发布于 2012-08-25 02:38:55
问题是您的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-25 02:39:50
如果要包括与所有筛选器匹配的用户( AND比较):
instagramUsers.Where(u => instagramFilters.All(f => f(u)));如果要包括与一个或多个筛选器匹配的用户,请在上面的语句中通过Any更改All。
https://stackoverflow.com/questions/12114897
复制相似问题