2

List<Func<InstagramUser,bool>>のコレクションをフィルタリングするために を列挙しようとして失敗しましたList<InstagramUser>display()私のコードはコンパイルされますが、呼び出されたときにフィルター処理されていないリスト全体が返されます。

私の質問は、別のコレクションをフィルタリングするために使用できるラムダ式のコレクションを保持する適切な方法は何ですか?

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());
4

2 に答える 2

6

すべてのフィルターに一致するユーザーを含めたい場合(AND比較):

instagramUsers.Where(u => instagramFilters.All(f => f(u)));

1 つ以上のフィルターに一致するユーザーを含める場合は、上記のステートメントのAllbyを変更します。Any

于 2012-08-24T18:39:50.467 に答える
2

問題は、ステートメントが実行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-24T18:38:55.287 に答える