30000行のcsvファイルがあります。多くの条件に基づいて多くの値を選択する必要があるため、多くのループと「if」を使用してlinqを使用することにしました。csvを読むためのクラスを作成しました。linqで使用するIEnumerableを実装します。これは私の列挙子です:
class CSVEnumerator : IEnumerator
{
private CSVReader _csv;
private int _index;
public CSVEnumerator(CSVReader csv)
{
_csv = csv;
_index = -1;
}
public void Reset(){_index = -1;}
public object Current
{
get
{
return new CSVRow(_index,_csv);
}
}
public bool MoveNext()
{
return ++_index < _csv.TotalRows;
}
}
動作していますが、遅いです。100;150行の範囲の列Aで最大値を選択するとします。
max = (from CSVRow r in csv where r.ID > 100 && r.ID < 150 select r).Max(y=>y["A"]);
これは機能しますが、linqは48行ではなく30000行で最大値を検索します。前述したように、ループを使用できますが、この例の場合のみ、条件は「残忍」です:)
linqコレクション検索をオーバーライドする方法はありますか?次のようなものです。列挙子で使用されているクエリを調べ、「where」のlinq条件に「rowID filter」が含まれているかどうかを調べ、これに基づいて別のデータを提供します。
データの一部を別の配列/コレクションにコピーしたくないのですが、csvリーダーに問題はありません。idですべての行にアクセスするのは高速ですが、問題は30000個すべてにアクセスする場合だけです。必要なヘルプ:-)