Diskuze: vracení více hodnot jednou metodou

C# .NET .NET (C# a Visual Basic) vracení více hodnot jednou metodou American English version English version

Avatar
keke1
Člen
Avatar
keke1:

Ahojte,

existuje nějaká možnost jednou metodou v třídě vrátit více hodnot?
Rychlý nástin:
Z DB potřebuji načíst řádky údajů (neměnný formát tabulky--- nemůžu upravit tabulku, že bych do ni přidal jeden sloupec pro tuto vypočtenou hodnotu) a k nim dopočítat hodnotu a tohle vrátit do hlavního programu, kde tyto údaje vypíšu na obrazovku.

Taky mi nepomůže GET, protože existuje právě jedna instance třídy, která mi děla dotaz do DB a vrací mi LIST<nazevTabulky>

nejvhodnější by bylo vrátit pomocí return <nazevTabulky> + hodnota;
ale to samozřejmě nejde... :-(

 
Odpovědět 27.8.2013 9:54
Avatar
Odpovídá na keke1
Michal Žůrek (misaz):

můžeš si napsat vlastni třídu a předávat tu:

class Neco {
    public int neco1;
    public int neco2;
}
Nahoru Odpovědět 27.8.2013 10:05
Nesnáším {}, proto se jim vyhýbám.
Avatar
Theodor Johnson
Redaktor
Avatar
Nahoru Odpovědět 27.8.2013 10:13
Přecházím na "Cross-Platform Development"
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

... neboli Messenger.

Pojem Tabulka v DB je vlastně ekvivalentem pro seznam n-tic s nedefinovaným pořadím. Původně jsem chtěl napsat množina, ale to by vylučovalo duplicitní záznamy.

Nahoru Odpovědět 27.8.2013 10:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na keke1
Luboš Běhounek (Satik):

Nebo můžeš použít ref / out.

Nahoru Odpovědět  -1 27.8.2013 11:11
:)
Avatar
keke1
Člen
Avatar
keke1:

Díky všem :-)
zkusil jsem pro mne novinku Tuple<> a po potřebné úpravě programu to opravdu funguje tak, jak potřebuji. Opravdu moc díky :-)

 
Nahoru Odpovědět 27.8.2013 11:24
Avatar
keke1
Člen
Avatar
keke1:

Jen se ještě zeptám, protože Tuple jsem použil poprvé... jsou nějaké zásadní nevýhody tohoto použití? např. zbytečně velké nároky na paměť, citelná ztráta výkonu atd... máte někdo nějaké špatné zkušenosti s Tuple? Kdy ho není třeba vhodné používat? předem díky za vaše názory

 
Nahoru Odpovědět 27.8.2013 11:39
Avatar
vitamin
Člen
Avatar
Odpovídá na keke1
vitamin:

Tuple je trieda, takze ma vsetky nevyhody a vyhody tried (relativne velka pametova rezia, GC, ...). Ak je pre teba velmi dvolezita rychlost tak radsej pouzi ref/out alebo vrat strukturu ktora bude obsahovat data. Ak nie je rychlost prvorada tak kludne pouzi Tuple, bude to prehladnejsie.

 
Nahoru Odpovědět 27.8.2013 15:50
Avatar
Kit
Redaktor
Avatar
Odpovídá na vitamin
Kit:

Kdyby sis to vyzkoušel, tak bys zjistil, že rychlost je stejná. Proto je lepší udělat return Tuple, protože je přehlednější. Zároveň umožňuje tuto přepravku ihned použít, což ref neumí.

Navíc při vyvolání výjimky v metodě se return chová mnohem lépe - návratový objekt se vůbec nevytváří.

Nahoru Odpovědět  -1 27.8.2013 16:02
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Zase píšeš nesmysly, rychlost stejná není.

Nahoru Odpovědět 27.8.2013 16:15
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

To jsi měřil nebo hádáš? Je přece výkonově jedno jestli instanci té přepravky dělám vně nebo uvnitř metody. Když ji udělám uvnitř, tak je to objektově čisté.

Nahoru Odpovědět 27.8.2013 16:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
vitamin
Člen
Avatar
Odpovídá na Kit
vitamin:

Ak pouzies ref/out tak nepotrebujes prepravku, ak pouzies strukturu ako prepravku tak sa prepravka alokuje na stacku, ak pouzies tuple tak je alokovana prepravka na heape. Kazda moznost ma ine vyhody/nevyhody. Tuple je navyse readonly.

 
Nahoru Odpovědět  +1 27.8.2013 16:34
Avatar
Kit
Redaktor
Avatar
Odpovídá na keke1
Kit:

Z DB potřebuji načíst řádky údajů (neměnný formát tabulky--- nemůžu upravit tabulku, že bych do ni přidal jeden sloupec pro tuto vypočtenou hodnotu) a k nim dopočítat hodnotu a tohle vrátit do hlavního programu, kde tyto údaje vypíšu na obrazovku.

Tohle běžně dělám. Přidám si do tabulky virtuální sloupec, který vznikne jako výsledek výrazu. Odpadne tím zmíněný mezičlánek a dostanu jen údaje, které skutečně potřebuji. Tabulka se tím vůbec nezmění.

Nahoru Odpovědět 27.8.2013 16:34
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na vitamin
Kit:

To je přece dobře, že je tuple readonly. Je to immutable objekt a je to žádoucí vlastnost. Přece ho nebudu modifikovat.

Tuple je implementací přepravky.

Editováno 27.8.2013 16:37
Nahoru Odpovědět 27.8.2013 16:36
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:

http://www.itnetwork.cz/…ash/test.png bude ti stačit tohle ? Testováno 108 vrácení přes struct, class, tuple a 2x out.

 
Nahoru Odpovědět  +1 27.8.2013 16:50
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

No jo, stejně však ten out musíš zabalit do struct, class nebo tuple, abys ho mohl dál použít k požadovanému účelu. Takže tím nic nezískáš.

Nahoru Odpovědět  -1 27.8.2013 16:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Kit
Jan Vargovský:

To už závisí na daném problému, ale tady vidíš že je to cca 5x rychlejší :)

 
Nahoru Odpovědět  +1 27.8.2013 17:01
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jan Vargovský
Kit:

Je to rychlejší, protože jsi to vytrhl z kontextu programu. Když to pak použiješ ve skutečném programu, výsledek bude podobný. Ale to už asi měřit nebudeš, protože v tomhle testu jsi získal sice zajímavý, ale nepoužitelný výsledek.

Nahoru Odpovědět  -2 27.8.2013 17:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Hádám, ale je to logické, vytvoření instance třídy zabere přece mnohem víc než jen uložení hodnoty na stack/do registru.

Nahoru Odpovědět 27.8.2013 17:15
:)
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

Jsi hrozný demagog.

Píšeš, že rychlost je stejná, někdo ti dokáže opak, tak napíšeš, že to vlastně nevadí.

Už mě to začíná trochu unavovat, děláš to často a často u věcí, kterým evidentně moc nerozumíš.

Nahoru Odpovědět  +1 27.8.2013 17:21
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

Vyšel jsi z předpokladu, že dál budeme používat tyto dvě proměnné primitivního datového typu samostatně. V tom případě to v daném místě skutečně rychlejší bude. Ale stejně ty dvě proměnné budeš muset do něčeho zabalit, abys to mohl dál použít. Proč si to nenechat zabalit rovnou v té metodě, která ta data poskytuje?

Nahoru Odpovědět 27.8.2013 17:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět 27.8.2013 17:23
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

A co když je dohromady potřebovat nebude?

Nahoru Odpovědět 27.8.2013 17:23
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

V tom případě má chybu v návrhu aplikace.

Nahoru Odpovědět  -1 27.8.2013 17:25
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):

"Tak se neunavuj :)"

  • Rád bych, ale vadí mi, když někdo (s tvojí reputací) roztrušuje po fóru nesmysly a ještě se je o nich schopný hádat.

Možná umíš databáze a lepíš do sebe knihovny (aby jsi nemusel používat algoritmy), ale co se týče některých věcí, tak jsi dost mimo.

Nahoru Odpovědět  +4 27.8.2013 17:26
:)
Avatar
Kit
Redaktor
Avatar
Nahoru Odpovědět 27.8.2013 17:30
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Lukáš Hruda (Luckin):

Proč by měl mít někdo chybu v návrhu aplikace jenom proto že použije dvě samostatné proměnné? Co když to tak udělá jen proto aby šetřil výkonem?

 
Nahoru Odpovědět 27.8.2013 19:46
Avatar
Kit
Redaktor
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Kit:

Metoda, která vrací dvě nezávislé hodnoty, u kterých potřebuji každou jinde, je přinejmenším podivná.

Nahoru Odpovědět 27.8.2013 20:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Libor Šimo (libcosenior):

V tomto vlákne bolo spomenutých niekoľko spôsobov ako vrátiť jednou metódou viacej hodnôt.

Mám prosbu.

Mohli by ste sem dať jednoduché príklady?
Úloha: vrátiť lokalizáciu bodu hodnotou x, y.

Mne sa páčilo, čo napísal Misaz, predstavujem si to asi takto:
(dúfam, že správne)

class Neco {
    public int neco1;
    public int neco2;
}

class Pozicia
{
    Neco neco = new Neco();
    public Neco VratXaY(int x, int y)
    {
       neco.X = x;
       neco.Y = y;
       return neco;
    }
}

Môže niekto doplniť príklad na Tuple<>, ref / out, struct?

Nahoru Odpovědět 3.9.2013 7:28
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Čápka:

Obdivuji tvoji schopnost neustále vyhledávat podivná řešení.

Nahoru Odpovědět 3.9.2013 8:08
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
vitamin
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
vitamin:
public struct Pair<T1, T2>
{
    public T1 first;
    public T2 second;

    public Pair(T1 f, T2 s)
    {
        first = f;
        second = s;
    }
}
public abstract struct Pair
{
    public static Pair<T1, T2> Create<T1, T2>(T1 f, T2 s)
    {
        return new Pair<T1, T2>(f, s);
    }
}

public Pair<int, int> VratStruct(int x, int y)
{
    return Pair.Create(x, y);
}
public Tuple<int, int> VratTuple(int x, int y)
{
    return Tuple.Create(x, y);
}
public void VratByRef(ref int x, ref int y)
{
    x = 45;
    y = 13;
}
 
Nahoru Odpovědět 3.9.2013 8:13
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Kdyby se místo těch blbostí ptal na správné řešení, tak bych mu poradil Point.

Nahoru Odpovědět  +1 3.9.2013 8:16
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
Odpovídá na vitamin
Libor Šimo (libcosenior):

Ďakujem.

@sdraco, ďakujem aj tebe za radu. :)

Nahoru Odpovědět 3.9.2013 8:48
Aj tisícmíľová cesta musí začať jednoduchým krokom.
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 33 zpráv z 33.