Mam plik csv z 30 000 linii. Muszę wybrać wiele wartości w oparciu o wiele warunków, więc w przypadku wielu pętli i "jeśli" zdecydowałem się użyć linq. Napisałem klasę do odczytu csv. Implementuje IEnumerable do użycia z linq. To jest mój moduł wyliczający:Czy można zmienić metodę wyszukiwania w LINQ?
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;
}
}
Działa, ale działa wolno. Powiedzmy, że chcę wybrać wartość maksymalną w kolumnie A w zakresie 100; 150 wierszy.
max = (from CSVRow r in csv where r.ID > 100 && r.ID < 150 select r).Max(y=>y["A"]);
to będzie działać, ale wyszukiwania LINQ do wartości max w 30 000 wierszy zamiast 48. Jak powiedziałem, mogę użyć pętli, ale tylko w tym przykładowym przypadku, warunki są „brutalne” :)
Czy istnieje sposób na zastąpienie wyszukiwania kolekcji linq. Coś jak: spójrz na kwerendę używaną na moim module wyliczającym, zobacz, czy jakiekolwiek warunki linq w "where" zawiera "filtr ID wiersza" i podaj inne dane w oparciu o to.
Nie chcę kopiować części danych do innej tablicy/kolekcji i problem nie występuje w moim czytniku csv. Uzyskiwanie dostępu do każdego wiersza według identyfikatora jest szybkie, a jedynym problemem jest dostęp do wszystkich 30 000 z nich. Każda pomoc uzyskała :-)
BTW, powinieneś zaimplementować 'IEnumerable'. –
SLaks
W jaki sposób jest to zaimplementowane -> 'new CSVRow (_index, _csv)'. Dostęp losowy lub sekwencyjny? – Tilak
Czy jesteś pewien, że linq to objects stosuje Max do wszystkich twoich rekordów, a nie tylko do tych 48? Dziwne, powinno stosować operatorów kolejno. Domyślam się, że twój moduł wyliczający jest po prostu powolny. –