Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android

Recomandare bicicleta e-bike 20&#...
 Bing-Content removal tool

Nu pot accesa monitorulsv.ro de l...

Cum sa elimini urmele de acnee?

Wc Geberit
 Routere detinute in trecut si in ...

Teii din fața casei

E-Mail in serie prin Excel si Out...

Modul alimentare rulou/jaluzea ex...
 Recuperare fișiere dupa form...

Aplicatii stress test RAM

Asigurare auto hibrid

Asus B550M - PC-ul nu porneste di...
 

Cum ai implementa enumerate in alt limbaj?

- - - - -
  • Please log in to reply
13 replies to this topic

#1
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
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
_Smiley_

_Smiley_

    Guru Member

  • Grup: Senior Members
  • Posts: 19,979
  • Înscris: 24.02.2006
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 Posted Image
daca vrei index, atunci discuti de iterare printr-o colectie, nu de enumerare a elementelor acesteia.

Edited by _Smiley_, 10 July 2019 - 20:34.


#3
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
E vorba de iterare + numerotare.

#4
red46

red46

    Senior Member

  • Grup: Senior Members
  • Posts: 4,528
  • Înscris: 06.03.2016
î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.


#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
Te limiteaza la colectii indexabile, cu altele nu merge.

#6
red46

red46

    Senior Member

  • Grup: Senior Members
  • Posts: 4,528
  • Înscris: 06.03.2016
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
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,189
  • Înscris: 24.02.2007
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
red46

red46

    Senior Member

  • Grup: Senior Members
  • Posts: 4,528
  • Înscris: 06.03.2016
Am modificat exemplul utilizând direct o expresie lambda.

#9
TorchMan

TorchMan

    Junior Member

  • Grup: Members
  • Posts: 226
  • Înscris: 21.10.2012

View Post_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 Posted Image. 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 Posted Image
https://hg.python.or...ts/enumobject.c

#10
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,383
  • Înscris: 10.08.2005

View Postred46, on 10 iulie 2019 - 20:51, said:

în C#:
string[] names = {"Aaaa", "Bbbb", "Cccc"};

for (int i = 0; i < names.Length; i++)
Console.WriteLine("{0}. {1}", i, names[i]);

idee lui enumerate era ca in urma a unei apelari sa-si faca singur iteratie

Edited by MarianG, 10 July 2019 - 21:17.


#11
red46

red46

    Senior Member

  • Grup: Senior Members
  • Posts: 4,528
  • Înscris: 06.03.2016

View Postdani.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.
Exemplu complet, implementând extensia .Enumerate()
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
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
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
red46

red46

    Senior Member

  • Grup: Senior Members
  • Posts: 4,528
  • Înscris: 06.03.2016
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
ovipic

ovipic

    Junior Member

  • Grup: Junior Members
  • Posts: 84
  • Înscris: 09.04.2019
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

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate