Autor Beitrag
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Do 25.03.10 21:29 
ist sowie so egal, wie du es machst. Bei where wird die iteration nicht durchlaufen, sondern ein Verweis auf das orginal behalten und das predicate erst beim MoveNext() des Enumerable ausgewertet und wenn die auswertung negativ war, wird ein weiteres MoveNext ausgelöst, bevor er dir das element wirklich wieder gibt, wenn ich es richtig weiß. Deshalb ist es an der stelle etwas schneller- aber die Rechenzeit geht dann eben beim auslesen drauf... Also wenn du z.B. mit einer foreach-Schleife wieder aus dem Enumerable rausschreibst oder es umwandelst.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 25.03.10 21:35 
Auf wen antwortest du gerade und was vergleichst du womit :gruebel: ?

_________________
>λ=
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Fr 26.03.10 17:34 
Die Antwort bezog sich auf den Versuch (und die Beschwerde, dass es nicht klappt) von Marc

ausblenden C#-Quelltext
1:
2:
3:
4:
  return
        from DataRow Article in dt.Rows
        where Article[col] is string && (filter.Contains(Article.Field<string>(col)))
        select Article;


durch so etwas wie

ausblenden C#-Quelltext
1:
2:
return
   dt.Rows.Cast<DataGridViewRow>().Where(artikel => filter.Contains(artikel.Field<string>(row));


zu ersetzen. Ich habe versucht darauf hinzuweisen, dass ich das nicht für nötig erachte, da es weder etwas in der Geschwindigkeit noch in der Lesbarkeit des Codes bringt. Ich habe es nochmal überprüft. Die Funktionen machen sogar exakt das Gleiche. Die IEnumerable.Where-Funktion überschreibt lediglich die MoveNext()-Funktion des IEnumerable (Genaugenommen liefert es ein neues WhereIterator-Object zurück, das IEnumerable implementiert und ein MoveNext() besitzt, der den Delegate (predicate) verwendet, um zu entscheiden, ob er ein Element zurück gibt oder überspringt). Bei meiner Variante wird ebenfalls intern ein Verweis auf die where-Klausel hinterlegt und beim Iterieren abgerufen. Geschwindigkeitsmäßig auch absolut identisch
(für 4000000 Einträge brauchte er bei meiner Variante beim ersten Test {00:00:03.4154747} und beim Zweiten {00:00:03.1981564} und bei deiner {00:00:03.2910341} im Ersten und {00:00:03.6841353} im Zweiten (Abh. von der Reihenfolge des Aufrufs). Das würde ich mal als nahezu identisch einstufen. Der Ausschluss von DBNull muss in jedem Fall gemacht werden, dass habe ich auch gecheckt.

Naja, aber du hast wahrscheinlich recht und das will garniemand wissen:). Aber mir ist grad furchtbar langweilig, weil ich heute Urlaub habe:)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 27.03.10 04:15 
user profile iconnorman2306 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe versucht darauf hinzuweisen, dass ich das nicht für nötig erachte, da es weder etwas in der Geschwindigkeit noch in der Lesbarkeit des Codes bringt.
Na knapp kürzer ist zweite Version jedenfalls :zwinker: . Ich empfinde from x ... select x persönlich einfach als Code Smell, denn das select ist damit quasi nutzlos und es könnte eben (semantisch) prägnanter ohne Query Expression ausgedrückt werden.
Sowieso halte ich mich mit dem Gebrauch von Query Expressions eher zurück, da man meistens früher oder später auf irgendeine Funktion stößt, die kein Query-Expression-Äquivalent besitzt und damit die gesamte Abfrage zu einem Mischmasch aus beiden Formen verkommt. Aber wie gesagt, das fällt wahrscheinlich eher unter "persönliche Meinung" ;) .

user profile iconnorman2306 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe es nochmal überprüft. Die Funktionen machen sogar exakt das Gleiche.
Kein Wunder. Schau dir das Ergebnis einmal im Reflector an, beide erzeugen exakt den gleichen IL-Code :idea: . Gleichheit in Performance und Laziness-Verhalten also garantiert.

user profile iconnorman2306 hat folgendes geschrieben Zum zitierten Posting springen:
Der Ausschluss von DBNull muss in jedem Fall gemacht werden, dass habe ich auch gecheckt.
Interessant, warum funktioniert meine Version dann bei mir?

user profile iconnorman2306 hat folgendes geschrieben Zum zitierten Posting springen:
Naja, aber du hast wahrscheinlich recht und das will garniemand wissen:).
Für andere kann ich nicht mitreden, aber mich interessiert sowas auf jeden Fall :D .

_________________
>λ=