IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
hanpari
Člen
Avatar
hanpari:5.12.2014 15:58

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 Hartinger
Vlastník
Avatar
Odpovídá na hanpari
David Hartinger:5.12.2014 16:03

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
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na hanpari
David Hartinger:5.12.2014 16:04

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
5.12.2014 16:04
New kid back on the block with a R.I.P
Avatar
hanpari
Člen
Avatar
Odpovídá na David Hartinger
hanpari:5.12.2014 16:07

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

 
Nahoru Odpovědět
5.12.2014 16:07
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na hanpari
Jan Vargovský:5.12.2014 16:46

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
5.12.2014 16:46
Avatar
hanpari
Člen
Avatar
Odpovídá na Jan Vargovský
hanpari:5.12.2014 16:56

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
Člen
Avatar
Odpovídá na David Hartinger
hanpari:5.12.2014 18:03

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
Tvůrce
Avatar
Odpovídá na hanpari
coells:5.12.2014 19:42
var product = Enumerable.Range(0, 10).SelectMany(x => Enumerable.Range(0, 15).Select(y => new { x = x, y = y }));
 
Nahoru Odpovědět
5.12.2014 19:42
Avatar
hanpari
Člen
Avatar
Odpovídá na coells
hanpari:5.12.2014 20:50

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
Tvůrce
Avatar
Odpovídá na hanpari
coells:5.12.2014 21:38

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
5.12.2014 21:38
Avatar
hanpari
Člen
Avatar
Odpovídá na coells
hanpari:6.12.2014 6:48

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
Tvůrce
Avatar
Odpovídá na hanpari
coells:6.12.2014 16:21

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
6.12.2014 16:21
Avatar
hanpari
Člen
Avatar
Odpovídá na coells
hanpari:6.12.2014 18:23

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:6.12.2014 18:30

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.