Cum ai implementa enumerate in alt limbaj?
Last Updated: Jul 12 2019 22:33, Started by
dani.user
, Jul 10 2019 19:49
·
0
#1
Posted 10 July 2019 - 19:49
In Python se poate scrie simplu si elegant urmatorul cod:
names = ["Aaaa", "Bbbb", "Cccc"] for (i, name) in enumerate(names): print("%d. %s" % (i, name)) Quote 0. Aaaa 1. Bbbb 2. Cccc Provocare: Cum ai implementa enumerate intr-un mod similar in alt limbaj? |
#2
Posted 10 July 2019 - 20:34
in c#:
foreach(var name in names) Console.WriteLine(name); teoretic conceptele de enumerare si de index nu sunt compatibile, deci ce ai scris tu acolo fie nu e enumerare, fie nu e elegant daca vrei index, atunci discuti de iterare printr-o colectie, nu de enumerare a elementelor acesteia. Edited by _Smiley_, 10 July 2019 - 20:34. |
#4
Posted 10 July 2019 - 20:51
în C#:
string[] names = {"Aaaa", "Bbbb", "Cccc"}; for (int i = 0; i < names.Length; i++) Console.WriteLine("{0}. {1}", i, names[i]); Edited by red46, 10 July 2019 - 20:52. |
#6
Posted 10 July 2019 - 20:58
Sau putem folosi liste în loc de array-uri:
List<string> names = new List<string>() { "Aaaa", "Bbbb", "Cccc"}; foreach (var name in names.Select((Value, Index) => new {Value, Index})) Console.WriteLine("{0}. {1}", name.Index, name.Value); Edited by red46, 10 July 2019 - 21:11. |
#7
Posted 10 July 2019 - 21:04
Nu stiu sa existe acel .Enumerate in .NET. Cum l-ai implementa (pentru orice colectie, nu neaparat lista)? E treaba de 1-2 randuri.
|
#8
Posted 10 July 2019 - 21:06
Am modificat exemplul utilizând direct o expresie lambda.
|
#9
Posted 10 July 2019 - 21:08
_Smiley_, on 10 iulie 2019 - 20:34, said:
in c#: foreach(var name in names) Console.WriteLine(name);teoretic conceptele de enumerare si de index nu sunt compatibile, deci ce ai scris tu acolo fie nu e enumerare, fie nu e elegant daca vrei index, atunci discuti de iterare printr-o colectie, nu de enumerare a elementelor acesteia. Numele functieie numerate din python poate fi putin ambiguu . Tot ce face e ca ofera o metoda standardizata de a creste un contor pe masura ce se parcurge un iterabil (deci iteram prin colectie) Si on-topic: Enumerate e o functie-generator a carei implementare e ceva semanator def enumerate(iterable, start=0): count = start for elem in iterable: yield count, elem count += 1 Frumusetea e ca acel yield iti da rezultatele on-the-fly, nu la finalul iterarii prin obiect. Astfel, performantele nu sunt afectate daca in iterabilul respectiv sunt 10 sau 10 milioane de items. Deci provocarea ar fi sa implementezi mai intai conceptul de yield, daca nu exista o alternativa deja. Poti arunca un ochi peste implementarea din cpython https://hg.python.or...ts/enumobject.c |
#10
Posted 10 July 2019 - 21:16
|
#11
Posted 10 July 2019 - 21:41
dani.user, on 10 iulie 2019 - 21:04, said:
Nu stiu sa existe acel .Enumerate in .NET. Cum l-ai implementa (pentru orice colectie, nu neaparat lista)? E treaba de 1-2 randuri. public static class IEnumerableExt { public static IEnumerable<Tuple<int, T2>> Enumerate<T2>(this IEnumerable<T2> a) { return a.Select((item, i) => Tuple.Create(i, item)); } } Utilizare: List<string> names = new List<string>() { "Aaaa", "Bbbb", "Cccc" }; foreach (var name in names.Enumerate()) Console.WriteLine("{0}. {1}", name.Item1, name.Item2); Desigur, o variantă mai bună ar fi fost utilizarea ValueTuple din C# 7.0 în loc de Tuple, unde puteam scăpa de "Item1" și "Item2". Revin cu exemple după ce mă uit puțin pe documentație. Edited by red46, 10 July 2019 - 22:02. |
#12
Posted 10 July 2019 - 22:32
In rust e in Iterator: https://doc.rust-lan...ethod.enumerate
Indexul si valoarea sunt retinute si updatate de la iteratie la iteratie in structura Enumerate: https://doc.rust-lan....Enumerate.html care are blanket impl pentru orice iterabil. Side-note: la rust mai e suficient de munca, dar faptul ca poti scrie blanket implementations e genial. Deci per total, nu e nevoie sa implementezi enumerate, pentru ca e deja implementat. In rust, la fel ca in python sau php, ai generatoare si cuvantul cheie yield, deci asta ai folosi daca ai vrea sa implementezi. In PHP nu e nevoie de o functie enumerate, pentru ca are sintaxa speciala in limbaj. (foreach ($names as $i => $name) {...} ). Daca ar fi sa compar ca limbaj, dintre python, php si rust, rust are cele mai ortogonale concepte*, iar restul lucrurilor sunt implementate in biblioteca standard. In celelalte limbaje e mai multa magie la mijloc. * in discutia noastra ar fi vorba despre yield, pattern matching / decomposition |
#13
Posted 10 July 2019 - 22:41
Implementarea cu ValueTuple:
public static class IEnumerableExt { public static IEnumerable<(int, T2)> Enumerate<T2>(this IEnumerable<T2> a) { return a.Select((item, i) => (i, item)); } } List<string> names = new List<string>() { "Aaaa", "Bbbb", "Cccc" }; foreach ((int i, string name) in names.Enumerate()) Console.WriteLine("{0}. {1}", i, name); Edited by red46, 10 July 2019 - 22:42. |
#14
Posted 12 July 2019 - 22:33
Golang
a := []string{"Foo", "Bar"} for idx, s := range a { fmt.Println(idx, s) } 0 Foo 1 Bar |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users