Laden...

LINQ Where Klausel verhält sich anders als beim manuellen Filtern bzw. Filtern per For-Schleife

Erstellt von Cornflake vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.239 Views
C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 7 Jahren
LINQ Where Klausel verhält sich anders als beim manuellen Filtern bzw. Filtern per For-Schleife

Hallo Leute

Ich habe in C# eine Datei mit 1,7 Millionen Zeilen a 45 Zeichen Länge eingelesen.
Danach selektiere ich bestimmte Zeilen und gruppiere sie.
Danach bleiben ca 1,5 Millionen Zeilen übrig.

Wenn ich aber beim where Teil eine Methode zur Prüfsummenberechnung aufrufe bleiben immer nur 69.998 Zeilen übrig.
Die Methode selber sollte höchstens 100.000 Einträge abweisen und wenn ich von Hand fehlende Einträge nachprüfe, werden die akzeptiert.
Auch wenn ich die Datei über eine for-Schleife durchlaufen lassen, lässt die Methode nur ca 100.000 Einträge weg.

Daher innerhalb des Linq ergibt die Methode Fehler.
Warum?

Quelldatei:


1888888888 BLAblablsaBLAblablsblablablablalba
2888888888 BLAblablsaBLAblablsblablablablalba
3888888888 BLAblablsaBLAblablsblablablablalba
4888888888 BLAblablsaBLAblablsblablablablalba
... ca. 1,7 Millionen mal

Quellcode:


 string[] q1 = File.ReadAllLines("Quelldatei.txt");

var v1 = from z in q1
                     select new
                     {
                         zahl = z.Substring(1, 10).Trim(),
                         text = z.Substring(11).Trim()
                     };

var v11 =  from s in v1
                      where 
                      isBerechnungOk(s.zahl, 10) && //Hier Fehler!
                      s.zahl.Length == 10
                      orderby s.zahl
                      group s by s.zahl into sGrp
                      select new
                      {
                          zahl = sGrp.Key,
                          text = sGrp.First().text
                      }  ;


//Ohne  isBerechnungOk = 1550314
//Mit     isBerechnungOk = 69998 
Console.WriteLine("zeilen: " + v11.ToList().Count.ToString());
Console.ReadKey();


Wenn benötigt, kann ich die Methode posten, ist aber etwas länger. Die Methode verwendet nur int,string datentypen und forschleifen mit % Berechnung.

Hat jemand eine Ahnung warum? Gibt es in Linq einen Stacküberlauf, kann ich für Linq einen Wert erhöhen?

Grüße Cornflake

W
955 Beiträge seit 2010
vor 7 Jahren

Stimmt denn zahl? SubString ist zero based.

771 Beiträge seit 2009
vor 7 Jahren

Bist du sicher, dass der Fehler nicht an der Gruppierung liegt.
Ist s.zahl wirklich jeweils eindeutig in der Datei?
Wäre es dann nicht besser erst zu gruppieren und dann die Berechnungsabfrage auf s.zahl durchzuführen?

Und auch


isBerechnungOk(s.zahl, 10) &&
s.zahl.Length == 10

würde ich umdrehen, denn die Berechnung wird sicherlich länger dauern als die Längenabfrage.

Edit: witte - ja, das wird es sein...

C
Cornflake Themenstarter:in
142 Beiträge seit 2007
vor 7 Jahren

8o 8o 8o
Peinlich. Ich glaube witte du hast Recht. Das habe ich voll übersehen und würde alles erklären. Daher auch keine Fehlermeldungen etc.
Werde ich gleich mal testen.

@cat: Danke für den Verbesserungstipp, werde ich auch mit einfließen lassen.