我正在尝试通过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());
答案 0 :(得分:6)
如果您想要包含与所有匹配的用户(AND
比较):
instagramUsers.Where(u => instagramFilters.All(f => f(u)));
如果您想要包含与1个或更多过滤条件匹配的用户,请在上述语句中将All
更改为Any
。
答案 1 :(得分:2)
问题是您的ForEach
语句实际上并未使用或存储您正在运行的Where
方法的结果。您需要构建结果IEnumerable<T>
,并将其按顺序过滤。
您可以将其写为:
public IEnumerable<InstagramUser> display() {
IEnumerable<InstagramUser> users = instagramUsers;
foreach(var filter in instagramFilters)
users = users.Where(filter);
return users;
}