Avatar
hanpari
Redaktor
Avatar
hanpari:

Ahoj,

nechci začínat flamewar, jen by mne zajímal názor těch, co znají c# a python, jestli je c# opravdu tak upovídaný, nebo je to jen můj dojem.

Proč se na to ptám. Chci si trochu osvěžit to málo, co znám ze C#, ale buď dělám něco špatně, nebo prostě nemám dost zkušeností, ale kód z pythonu na pár řádek jsou "stránky" textu v C# :)

Říká se, že by Python měl být povězme o třetinu kratší. No, v mém případě nejde o třetinu :)

Existují v C# konstrukce, které nějakým způsobem se podobají pythoním modulům itertools, například product?

Jak inteligentně nahradit třeba tento zápis, myslím teď jak naplnit dvourozměrné pole jedním řádkem?

lab = new HashSet<Point>();
for (int i = 1; i <= width; i++)
 {
    for (int j = 1; j <= height; j++)
    {
        lab.Add(new Point(i,j));
    }
                        }

V pythonu bych napsal:

from itertools import product
{(i,j) for i,j in product(range(10), range(15))}

Nezná někdo nějaký odkaz, kde by byly ekvivalenty těchto konstrukcí?

 
Odpovědět 5.12.2014 15:58
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na hanpari
David Čápka:

V C# je plno syntaxe, má LINQ, kde figurují lambda funkce, hodně věcí se tam dá napsat krátce. nevím jak tenhle konkrétní příklad, ale třeba proti Javě bude v C# kód vždy hodně kratší. Java má sice lambdy taky, ale šíleně ukecané. Výhoda C# je statické typování, sice toho víc napíšeš, ale aplikace se potom mnohem lépe ladí. Přijde mi divné srovnávat jazyky podle toho jestli v nich naplníš 2d pole na 1 řádek, to v praxi moc nikoho nezajímá.

Nahoru Odpovědět 5.12.2014 16:03
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na hanpari
David Čápka:

Pro ukázku třeba takhle se udělá pole mocnin (z MSDN):

IEnumerable<int> squares = Enumerable.Range(4, 3).Select(x => x * x);
Nahoru Odpovědět  +1 5.12.2014 16:04
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
hanpari
Redaktor
Avatar
Odpovídá na David Čápka
hanpari:

Já nesrovnávám jen se ptam abych zbytečne nevymyslel kolo :)

 
Nahoru Odpovědět 5.12.2014 16:07
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na hanpari
Jan Vargovský:

Ekvivalent tam je, ale zrovna u tohoto příkladu si nepomůžeš. Enumerable.Ran­ge(...) ti jen nahradí cyklus.

Enumerable.Range(1, width).ToList().ForEach( i =>  lab.UnionWith(Enumerable.Range(1, height).Select(j => new Point(i, j))));

Posuď co je lepší no :) Díky extension metodám si to můžeš naimplementovat sám, ale bylo by to výrazně pomalejší než prostě napsat 2 fory pod sebe a udělat to "po staru".

EDIT: Ještě by se hodilo přidat AddRange metodu :)

public static class Extension
{
    public static void AddRange<T>(this HashSet<T> hashSet, IEnumerable<T> collection)
    {
        foreach (var item in collection)
            hashSet.Add(item);
    }
}

Enumerable.Range(1, width).ToList().ForEach(i => lab.AddRange(Enumerable.Range(1, height).Select(j => new Point(i, j))));
Editováno 5.12.2014 16:50
 
Nahoru Odpovědět  +1 5.12.2014 16:46
Avatar
hanpari
Redaktor
Avatar
Odpovídá na Jan Vargovský
hanpari:

Díky ten příklad byl jen proto abych vysvětlil o co mi jde

 
Nahoru Odpovědět 5.12.2014 16:56
Avatar
hanpari
Redaktor
Avatar
Odpovídá na David Čápka
hanpari:

Nedá mi to, abych nereagoval ohledně té bezpečnosti. Nic ve zlém, jen jsem si vzpomněl na tenhle starší článek:

http://lukeplant.me.uk/…-programmer/

Stačí číst dost funkcionální propagandy a budou ti ze C# hrůzou stávat chlupy i tam, kde sis nemyslel, že je máš :)
(Jak se ostatně stalo autorovi tohohle článku)

Ale to jen tak pro odlehčení. Jinak díky za příklady, navedli jste mne správným směrem. Pokud by měl někdo nějaké další, budu jen rád :)

 
Nahoru Odpovědět 5.12.2014 18:03
Avatar
coells
Redaktor
Avatar
Odpovídá na hanpari
coells:
var product = Enumerable.Range(0, 10).SelectMany(x => Enumerable.Range(0, 15).Select(y => new { x = x, y = y }));
 
Nahoru Odpovědět  +2 5.12.2014 19:42
Avatar
hanpari
Redaktor
Avatar
Odpovídá na coells
hanpari:

Ahoj a díky,

pokud tomu dobře rozumím, všechny ty příklady jsou LINQ?

 
Nahoru Odpovědět 5.12.2014 20:50
Avatar
coells
Redaktor
Avatar
Odpovídá na hanpari
coells:

Language-Integrated Query (LINQ) zápis by byl

var product = from x in Enumerable.Range(0, 10)
              from y in Enumerable.Range(0, 15)
              select new { x = x, y = y };

Ale ten obvykle nepoužívám.

 
Nahoru Odpovědět  +1 5.12.2014 21:38
Avatar
hanpari
Redaktor
Avatar
Odpovídá na coells
hanpari:

Aha, já jen že jsem to chvilku zkoušel a zjistil jsem, že Enumerable patří do jmenného prostoru: System.Linq.

Mimochodem, proč ho nepoužíváš? Není čitelnější?

 
Nahoru Odpovědět 6.12.2014 6:48
Avatar
coells
Redaktor
Avatar
Odpovídá na hanpari
coells:

V 99% procentech případů LINQ syntaxe přehlednější není, typicky:

var filtered = from person in people
                     where person.Age > 30
                     select person;

var filtered = people.Where(p => p.Age > 30);
 
Nahoru Odpovědět  +1 6.12.2014 16:21
Avatar
hanpari
Redaktor
Avatar
Odpovídá na coells
hanpari:

Chápu, v podstatě se mi líbí oba zápisy. Díky.

 
Nahoru Odpovědět 6.12.2014 18:23
Avatar
Odpovídá na coells
sadlomaslox25:

oboje je LINQ. to prvni se nazyva LINQ query syntaxe a to druhe LINQ method syntaxe.
http://msdn.microsoft.com/…b397947.aspx

 
Nahoru Odpovědět 6.12.2014 18:30
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.