Diskuze: C# - Více outputů z metody

C# .NET .NET (C# a Visual Basic) C# - Více outputů z metody American English version English version

Aktivity (1)
Avatar
Elisse
Člen
Avatar
Elisse:28.5.2016 6:27

Zdravím,
prosím Vás jak nějak elegantně řešit když máte metodu, u které je její výsledek více než jedna hodnota. Představte si nějakou dlouhou složitou metodu jejiz výsledkem jsou třeba 4x int 2x string. Dá se to řešit nějak "hezky" a jinak než prostě 6x zavolat get pro tydle výsledky ve smyslu

Metoda.GetprvniInt
Metoda.GetdruhyInt
...
Editováno 28.5.2016 6:27
 
Odpovědět 28.5.2016 6:27
Avatar
niderle.l
Člen
Avatar
Odpovídá na Elisse
niderle.l:28.5.2016 8:04

Osobně to řeším tak, že prostě pokud bude mít metoda více návratových hodnota, tak je postupně naskládám za sebe přes nějaký oddělovač a následně při návratu si je rozparsuju. To se dá dělat, když víš přesný počet hodnot. Ale neříkám, že je to nejlepší hodnota.

 
Nahoru Odpovědět  -2 28.5.2016 8:04
Avatar
Lukas C#
Redaktor
Avatar
Odpovídá na Elisse
Lukas C#:28.5.2016 9:05

Pokud jsou to třeba dva Integery, tak bych prostě vrátil dvouprvkové pole s těmito Inty. Ale když je těch výsledků víc jak 5, tak bych si vytvořil strukturu (s fieldy na výsledky), v metodě, která má ty výsledky vracet, ji inicializoval a vrátil.

 
Nahoru Odpovědět  +3 28.5.2016 9:05
Avatar
Xan95
Redaktor
Avatar
Xan95:28.5.2016 12:09

můžeš použít klíčové slovo out https://msdn.microsoft.com/…3c3bfhx.aspx
nebo vracet třídu či strukturu

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 28.5.2016 12:09
Avatar
Odpovídá na Elisse
Jakub Šárník:28.5.2016 12:12

Dá se to řešit různými způsoby. Pokud tvoří ty prvky nějaký logický celek, tak je vhodné na ně vytvořit nějakou třidu/strukturu. Pokud se například jeden z returnů využívá víc (např. přímo v podmínce), můžeš použít out parametry (jako to dělá např. metoda TryParse). V příští verzi C# naštěstí budeš moct vracet víc hodnot přes n-tice :-)

 
Nahoru Odpovědět 28.5.2016 12:12
Avatar
krepsy3
Redaktor
Avatar
krepsy3:28.5.2016 13:37

Mě přijde, že pokud je to int a string, je nejlepší použít jako návratový typ string[], popř. List<string> = new List<>(); pokud nevíš počet prvků. V generující metodě inty přetypuješ na stringy a při jejich použítí pak použiješ

List <string> navracene = Vygenerovat(); //Vygenerovat() je ta metoda co vrací více čísel či stringů
List<int> cisla = new List<>();
List<string> texty = new List<>();
foreach (string s in navracene)
{
        int i;
        if (int.TryParse(s, out i)) cisla.Add(i);
        else texty.Add(s)
}

Čímž si prvky roztřídíš dle datového typu do listů. Z listů si jepak klidně můžeš přenést do pole, pokud se ti s polem pracuje lépe.

Nahoru Odpovědět  -1 28.5.2016 13:37
Programátor je stroj k převodu kávy na kód.
Avatar
Odpovídá na Elisse
Ondřej Štorc:28.5.2016 13:51

Koukni se na Tuple<T1,...,Tn>

Nahoru Odpovědět  +1 28.5.2016 13:51
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Ondřej Štorc
Jakub Šárník:28.5.2016 15:19

Tuple<T...> nedoporučuji, nepracuje se z ní zrovna nejlépe (a pokud vím tak je v C# hlavně kvůli kompatibilitě s F#). Opravdové n-tice budou v jazyku až ve verzi C# 7 :)

 
Nahoru Odpovědět 28.5.2016 15:19
Avatar
Elisse
Člen
Avatar
Elisse:28.5.2016 17:36

Díky všem za reakce! nejvíce se mi asi zamlouvá vracet třídu :) Mě vůbec nenapadlo, díky moc! :)

 
Nahoru Odpovědět  +1 28.5.2016 17:36
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 10 zpráv z 10.