私はここで c# と linq の知識の限界を押し広げているので、私の例や、linq、c#、ジェネリック型、ラムダ式、デザイン パターンなどの理解が完全に間違っている場合は、ご容赦ください。
2 つのコレクションを保持するクラスがあります。1 つはフィルター処理IEnumberable<InstagramUser>
するコレクションで、2 つ目はフィルター処理する式のコレクションです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
で適用されるラムダ式を返すプロパティ (または関数 - 何が最適かはわかりません) があります。IEnumerable<InstagramUser>
display()
public class UserFilter : IInstagramFilter {
public Expression<Func<T, bool>> filter<T>(IQueryable<T> source) {
//return some expression - but how?
}
}
私はいくつかのことを理解するのに苦労しています:
各
IInstagramFilter
クラスの式を設定してメソッドで呼び出すdisplay()
方法は?各
IInstagramFilter
クラスにはフィルタリングに使用されるラムダがありますが、 Filter クラスには適切なラムダを最初に作成する方法IEnumerable<InstagramUser>
に関する知識がないため?IEnumerable<InstagramUser>
これは大まかにデコレータパターンに沿っていると思いますが、おそらく私が気付いていないより良いデザインが一緒にあるかもしれません.
更新されたコード
オリヴィエの答えに基づいて、これが私が今持っているものです。使用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
}
}