1

何時間も試して検索した後、今すぐ私の問題をあなたと共有する時が来たと思います。

問題の定義:整数(PropertyID)と文字列(McValue )を含むKeyValuePairs(filterPoolという名前の辞書があります。私がやろうとしているのは、それらのKeyValuePairsに応じて製品をフィルタリングし、それらをDataTable/Listとして返すことです。これは、動的な「Where ...And..」句をSQLとして構築することと見なすことができます。

これが私が使用しているコードです:

            foreach (KeyValuePair<int, string> filter in filterPool)
            {
                products = products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value));
            }
            return products.ToDataTable();                  

問題は、辞書で利用可能な最新のKeyValuePairに対して、上記のforeachループが1回だけ機能するように見えることです。

Stackoverflowで見つけた限り、私の問題に最も近い解決策は次のとおりでした:これもフィルタリングに値のディクショナリを使用しています

辞書とLINQを使用してフィルタリングするという目標を達成する方法が必要です。または、私が何とかして見落としている/無視している巨大なものがあります。

与えられた問題がすべての人にとって十分に明確であることを願っています、ありがとう^^

4

3 に答える 3

2

これは閉鎖の問題です。あなたは一時的なものを作ることによってそれを解決することができます:

        foreach (KeyValuePair<int, string> filterTmp in filterPool)
        {
            var filter = filterTmp; // Make a temporary
            products = products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value));
        }
        return products.ToDataTable();   

何が起こっているかの詳細については、EricLippertの投稿「有害と考えられるループ変数のクローズ」を参照してください。

また、この動作はC#5で変更されていることに注意してください。C#5 / VS2012では、このコードは期待どおりに機能します。

于 2012-08-09T19:10:58.797 に答える
1

foreachのすべての反復で製品コレクションを上書きしています。コレクションのデータ型がわからないのですが、代わりにforeachで次のようなことをしたいと思うでしょう。

products.AddRange(products.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value)));

それが理にかなっているかどうかはわかりませんが、filterPoolに一致する製品でいっぱいのコレクションを作成しようとしているようです。

于 2012-08-09T19:11:57.967 に答える
0

私はそれが骨材でよりよく解決されると思います:

return filter
    .Aggregate(products, (acc, filter) => acc.Where(i => i.PROPERTYID == filter.Key && i.MCVALUE.Equals(filter.Value)));
    .ToDataTable();
于 2012-08-09T19:26:50.637 に答える