【发布时间】:2012-08-19 09:14:15
【问题描述】:
我在这里挑战了我在 c# 和 linq 方面的知识极限,所以如果我完全不理解我的示例或对 linq、c#、泛型类型、lambda 表达式、设计模式等的理解,请多多包涵。
我有一个包含两个集合的类,一个是要过滤的集合:IEnumberable<InstagramUser>,第二个是要过滤的表达式集合:IEnumerable<IInstagramFilter>。
public class InstagramDisplay {
public IEnumerable<InstagramUser> instagramUsers;
public IEnumerable<IInstagramFilter> instagramFilters;
public InstagramDisplay() {
instagramUsers = new List<InstagramUser>();
instagramFilters = new List<IInstagramFilter>();
}
public IEnumerable<InstagramUser> display() {
instagramFilters.ToList().ForEach(x => instagramUsers.Where(x.filter(instagramUsers)));
return instagramFilters;
}
}
public interface IInstagramFilter {
Expression<Func<T, bool>> filter<T>(IQueryable<T> source);
}
我会让课程扩展IInstagramFilter。每个IInstagramFilter 类都有一个属性(或函数——不确定什么是最好的),它将返回将在display() 方法中应用于IEnumerable<InstagramUser> 的lambda 表达式。
public class UserFilter : IInstagramFilter {
public Expression<Func<T, bool>> filter<T>(IQueryable<T> source) {
//return some expression - but how?
}
}
我很难理解一些事情:
如何为每个
IInstagramFilter类设置表达式,然后在display()方法中调用?每个
IInstagramFilter类都有一个用于过滤IEnumerable<InstagramUser>的lambda,但由于Filter 类不知道IEnumerable<InstagramUser>,我如何首先创建合适的lambda?我认为这大致遵循装饰器模式,但也许有一个更好的设计,我不知道。
更新代码
根据 Olivier 的回答,这就是我现在所拥有的。在返回 display() 时,我在使用 .Where(filter) 时遇到错误
方法“
System.Linq.Enumerable.Where<TSource>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,bool>)”的类型参数无法从用法中推断出来。尝试明确指定类型参数。
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
}
}
【问题讨论】:
标签: c# linq lambda expression