DataViewはDataTableと似たようなクラスだが、
インスタンス生成時に既にインデックスを貼ってくれていたり、
まぁ色んな違いがある(投げやり)。
で、最近いじっていたあるコードがある。
1 2 3 4 5 6 7 8 9 10 11 12 |
public void SampleMethod(DataView dv) { // (中略) while(true) { dv.RowFilter = (フィルタ内容); // (dvを使った実行内容) if(条件式) break; // (中略) } } |
DataViewにRowFilterを設定し、その後の処理結果によってまた同じ操作を繰り返すというものだ。
(実際のコード上は無限ループにならないようになっています。念のため)
これがやけに時間がかかる。
原因はRowFilterがRowFilterを何度も行ったことだった。
なぜなら理由は単純で、RowFilterが実行された場合、DataViewは内部的にインデックスを設定してしまっているのだ。
インデックスを設定するために毎回全データを取得しに行っているわけで、これでは大変時間がかかる。
で、幸い「// (dvを使った実行内容)」の内容をRowFilterでなく、FindRowsに置き換えることが可能だったので、それでひとまず解決した。
FindRowsメソッドはインデックスを再設定しないのだ。
(参考:http://msdn.microsoft.com/ja-jp/library/bb669089(v=vs.110).aspx)
RowFilterで遅くなっている可能性を全く考えておらず、分かるのに時間がかかった。
ぱっと見、プロパティ設定してるだけに見えるからね、仕方ないね。
・・・修正したはいいけど、割と条件分岐が複雑なメソッドなので、テストに時間かかりそう。
(現に実装終わった後にバグを指摘されまくった)