Was ist das C # -Äquivalent der Kartenfunktion in Haskell?


80

Die Kartenfunktion in Haskell verfügt über zwei Eingabeparameter. Der erste Parameter ist eine Funktion und der zweite Parameter ist eine Liste. Die Map-Funktion wendet die als Eingabeparameter übergebene Funktion auf alle Elemente in der Liste an und gibt eine neue Liste zurück.

Gibt es ein C #, das dieser Funktionalität entspricht?


1
Vielleicht möchten Sie F # auschecken. Es schließt die Lücke zwischen C # und Haskell.
— ChaosPandion

3
Nicht wirklich. Es ist eher wie "OCaml für .NET".
— Jrockway

2
Ganz zu schweigen davon, dass alle Sprachen der ML-Familie (einschließlich F # und Haskell) wohl mehr miteinander gemein haben als mit jeder Sprache der C-Familie. Jeder, der mit F # umgehen kann, kann wahrscheinlich auch mit Haskell oder OCaml umgehen.
— CA McCann

1
@jrockway, @camccann: Ich spreche nicht über die Syntax der Sprache. Ich meine die Tatsache, dass F # Sie nicht zwingt, immer einen reinen Funktionsstil zu verwenden.
— ChaosPandion

Antworten:


94

Select

MSDN-Referenz

Siehe meine Frage hier (Nur wenn Sie neugierig sind, da es nicht direkt damit zusammenhängt).


8
Danke ... Dies ist etwas kontraintuitiv. Ich dachte, Select würde Zeilen aus einer Sammlung filtern.
— BM.

8
Ich hoffe wirklich, dass Sie meine Frage überprüfen.
— ChaosPandion

1
BM: Filterung kommt von wo.
— Edward KMETT

21

Eine andere Alternative zu Selectund SelectManybesteht darin, eine eigene Erweiterungsmethode zu schreiben.

public static IEnumerable<U> Map<T, U>(this IEnumerable<T> s, Func<T, U> f)
{
  foreach (var item in s)
    yield return f(item);
}

Danke Wes Dyer für diese süße Verlängerungsmethode! :) Siehe Beitrag für weitere Details.


15

Da Selectund SelectManybereits erwähnt, beantworte ich eine zusätzliche Frage, die Sie nicht gestellt haben: foldWird als Aggregat gefunden .

Jetzt sollte jeder, der dies liest, voll ausgestattet sein, um der Typ zu sein, der Sprache X mit Sprach-Y-Redewendungen schreibt. Lassen Sie sich also nicht zu sehr von Ihren C # -Kollegen mitreißen.


4
Nun, Camccann, es ist nichts Falsches daran, einen Funktionsschlüssel in Ihren Werkzeugkasten zu werfen, obwohl Sie unbedingt Nägel hämmern müssen. Möglicherweise müssen Sie einige Schrauben festziehen.
— ChaosPandion

4
@camccan Functional C # ist wirklich ziemlich gut. Nur weil die Sprache nicht streng funktional ist, bedeutet dies nicht, dass die meisten .net-Programmierer nicht sehr davon profitieren würden, Dinge viel funktionaler zu gestalten.

4
Die Verwendung der von C # angebotenen funktionalen Programmierfunktionen ist eine gute Idee. Das Erzwingen von C # in funktionale Redewendungen, die es nicht gut unterstützt (z. B. Curry-Teilanwendung, wie es in Haskell so beliebt ist), wird Ihnen wahrscheinlich Kopfschmerzen bereiten, Ihren Code verschleiern und jeden anderen ärgern, der arbeiten muss damit.
— CA McCann


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.