Citat:
Ursprungligen postat av
Binary
Du missar pongen. Jag anvnder funktionell stil s ofta som mjligt. Det ger mig mer lttlst, och mindre kod med frre buggar. T.ex. anvnder jag mycket Linq, det r en form av funktionell programmering.
En challenge: skriv om fljande kod till klassisk, imperativ stil s jmfr vi sedan?
Kod:
List<Tuple<string, string>> tuples = //
var grouped = tuples.GroupBy(t => t.First)
.OrderBy(grp => grp.Key)
.Select(grp => new { Key = grp.Key, Items = grp.OrderBy(t => t.Second) });
Den stora charmen med detta r att jag inte skapar en massa egna tillstnd i programmet med olika variabler. I stllet sger jag vad jag vill ha och d fr jag det. Det finns frre mjligheter att gra fel och jag ser mycket snabbare vad koden gr.
Nu kanske just detta r ett exempel dr linq passar vldigt bra, men i mnga fall s inser man att man kan optimera och ta bort minst en loop om man skriver koden utan linq.
Men vi kan testa. Jag skrev om ditt program s att det fungerar:
Kod:
List<Tuple<string, string>> tuples = new List<Tuple<string, string>>();
tuples.Add(Tuple.Create("1", "pelefant"));
tuples.Add(Tuple.Create("1", "apa"));
tuples.Add(Tuple.Create("2", "jagular"));
tuples.Add(Tuple.Create("2", "platypus"));
tuples.Add(Tuple.Create("3", "unicorn"));
var result = tuples.GroupBy(x => x.Item1)
.OrderBy(grp => grp.Key)
.Select(grp => new { Key = grp.Key, Items = grp.OrderBy(t => t.Item2) });
foreach(var r in result)
{
foreach (var i in r.Items)
{
Console.WriteLine($"{i}");
}
}
Och hr r samma kod i imperativt format villket blev 26 rader i stllet fr 19 rader.
Kod:
List<Tuple<string, string>> tuples = new List<Tuple<string, string>>();
tuples.Add(Tuple.Create("1", "pelefant"));
tuples.Add(Tuple.Create("1", "apa"));
tuples.Add(Tuple.Create("2", "jagular"));
tuples.Add(Tuple.Create("2", "platypus"));
tuples.Add(Tuple.Create("3", "unicorn"));
Dictionary<string, List<Tuple<string, string>>> groupedTuples = new Dictionary<string, List<Tuple<string, string>>>();
foreach (var tuple in tuples)
{
if (!groupedTuples.ContainsKey(tuple.Item1))
{
groupedTuples[tuple.Item1] = new List<Tuple<string, string>>();
}
groupedTuples[tuple.Item1].Add(tuple);
}
foreach (var key in groupedTuples.Keys.OrderBy(k => k))
{
var sortedTuples = groupedTuples[key].OrderBy(t => t.Item2);
foreach (var tuple in sortedTuples)
{
Console.WriteLine($"{tuple}");
}
}
Nu tycker jag egentligen inte att linq r det vrsta som C# har att erbjuda.
De kunde ha kallat select fr map i stllet och haft reduce, dvs samma som javascript.
Men s bra skulle det ju inte vara.
Det jag str mig p mest r folk som sitter och hittar p egena funktionella syntaxer
t.ex. genom att skapa en massa olika statiska metoder. Jo det r ju fint, men jag kan ju inte ditt
funtionella sprk du har hittat p. Linq r ju i alla fall en del av sprket och ngot man kan frvnta
sig att folk som stter sig in i ett nytt projekt kan grunderna i.