C# 枚举要筛选集合的表达式列表
在这里,我正在突破我在c#和linq方面知识的极限,因此如果我完全不了解我的示例或对linq、c#、泛型类型、lambda表达式、设计模式等的理解,请原谅我 我有一个类包含两个集合,一个是要筛选的集合:C# 枚举要筛选集合的表达式列表,c#,linq,lambda,expression,C#,Linq,Lambda,Expression,在这里,我正在突破我在c#和linq方面知识的极限,因此如果我完全不了解我的示例或对linq、c#、泛型类型、lambda表达式、设计模式等的理解,请原谅我 我有一个类包含两个集合,一个是要筛选的集合:IEnumerable,第二个是要筛选的表达式集合:IEnumerable 我正在努力理解一些事情: 如何为每个IInstagramFilter类设置表达式,然后在display()方法中调用它 每个IInstagramFilter类都会有一个lambda,用于过滤IEnumerable,但是由于
IEnumerable
,第二个是要筛选的表达式集合:IEnumerable
我正在努力理解一些事情:
IInstagramFilter
类设置表达式,然后在display()
方法中调用它IInstagramFilter
类都会有一个lambda,用于过滤IEnumerable
,但是由于filter类不知道IEnumerable
我首先如何创建适当的lambdadisplay()
时,我发现使用时出错。其中(过滤器)
无法从用法推断方法“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();