Ich habe eine CSV-Datei mit 30 000 Zeilen. Ich muss viele Werte basierend auf vielen Bedingungen auswählen, also habe ich mich für viele Schleifen und "if's" entschieden, linq zu verwenden. Ich habe Klasse geschrieben, um CSV zu lesen. Es implementiert IEnumerable zur Verwendung mit linq. Das ist mein Enumerator:Kann die Suchmethode in LINQ geändert werden?
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;
}
}
Es funktioniert, aber es ist langsam. Nehmen wir an, ich möchte den Maximalwert in Spalte A im Bereich 100, 150 Zeilen auswählen.
max = (from CSVRow r in csv where r.ID > 100 && r.ID < 150 select r).Max(y=>y["A"]);
Dies funktioniert, aber Linq sucht max-Wert in 30 000 Zeilen anstelle von 48. Wie gesagt, ich Schleife verwenden könnte, aber nur in diesem Beispielfall sind die Bedingungen „brutal“ :)
Gibt es eine Möglichkeit, die linq-Sammlungssuche zu überschreiben. Etwas wie: schaue in die Abfrage, die auf meinem Enumerator verwendet wird, schau, ob irgendwelche linq-Bedingungen in "wo" den "Zeilen-ID-Filter" enthalten und gib darauf basierend weitere Daten an.
Ich möchte nicht einen Teil der Daten in ein anderes Array/Sammlung kopieren und Problem ist nicht in meinem CSV-Reader. Der Zugriff auf jede Zeile nach ID ist schnell, das einzige Problem ist, wenn Sie auf alle 30 000 von ihnen zugreifen. Jede Hilfe geschätzt :-)
BTW, sollten Sie 'IEnumerable' implementieren. –
SLaks
Wie ist das implementiert -> 'neue CSVRow (_index, _csv)'. Direktzugriff oder sequenzieller Zugriff? – Tilak
Sind Sie sicher, dass linq to objects Max auf alle Ihre Datensätze und nicht nur auf diese 48 anwendet? Seltsam, sollte es Betreiber nacheinander anwenden. Meine Vermutung ist, dass Ihr Enumerator nur langsam ist. –