Warum hat Linq nicht Kopf und Schwanz?

7

Ich finde oft, dass ich Head- und Tail-Methoden für IEnumerables verwenden möchte, die nicht als Teil von Linq existieren. Während ich leicht mein eigenes schreiben könnte, frage ich mich, ob sie absichtlich weggelassen wurden. Zum Beispiel

%Vor%

Was ist also die beste Vorgehensweise in Bezug auf Linq? Ist die Tatsache, dass ich immer wieder Verwendungen finde, ein Zeichen dafür, dass ich nicht etwas empfohlen habe? Wenn nicht, warum wurde dieses gemeinsame funktionale Paradigma nicht in Linq implementiert?

    
Jim Jeffries 25.10.2013, 08:56
quelle

3 Antworten

7

Angesichts der Schnittstelle von IEnumerable<T> kann die Leistung nicht immer gewährleistet werden.

Sie stellen fest, dass die meisten funktionalen Programmiersprachen Tail und Head implementieren. Es sollte jedoch beachtet werden, dass diese Sprachen in Speicherkonstrukten agieren.

IEnumerable<T> hat keine solchen Einschränkungen und daher kann nicht davon ausgegangen werden, dass dies effizient ist.

Ein gebräuchliches funktionales Muster wäre beispielsweise, rekursiv am Kopf einer Sammlung zu arbeiten und dann den Tail des Aufrufs zu wiederholen ...

Wenn Sie dies zum Beispiel mit Entity Framework getan haben, würden Sie den folgenden (Meta) -Aufruf an den SQL-Server senden, tight looped.

%Vor%

Was sehr ineffizient wäre.

BEARBEITEN:

Kommen Sie, um darüber nachzudenken. Ein weiterer Grund ist, dass C # / VB.Net Tail-Rekursion nicht unterstützt, und daher kann dieses Muster leicht eine StackOverflow verursachen.

    
Aron 25.10.2013, 09:13
quelle
13

Technisch wäre Ihr Kopf .First () und Ihr Tail wäre .Skip (1) . Aber vielleicht können Sie eine bessere Lösung finden? Wie die Verwendung von .Aggregate () Ihr IEnumerable?

    
nvoigt 25.10.2013 08:59
quelle
1

Weil das "Kopf & amp; Tail" -Konzept in der funktionalen Programmierung für den Mustervergleich verwendet wird und rekursive Aufrufe. Da C # Mustervergleich nicht unterstützt, müssen die Methoden head () und tail () nicht implementiert werden.

%Vor%

Wie in Ihrem Fall - sollten Sie die Methode Aggregieren verwenden.

    
Dmitry Martovoi 25.10.2013 09:08
quelle

Tags und Links