Je potřeba vypsat hodnoty z pole integerů, ale tak, aby se v případě kladné hodnoty vypsal string 'pos', v případě záporné pak 'neg' a pro nulu pak 'null' - jak to udělat nejjednodušeji?
var values = new int[] { 5, -5, 0 };
foreach (var value in values)
{
//write out to Console either
'pos' for values above 0, 'neg' for values below 0 or 'null' for zero
}
Možná řešení si lze bez instalace VS vyzkoušet on-line zde: https://dotnetfiddle.net/q20ecK
Co třeba:
OdpovědětVymazatvar results = new string[3] {"neg","null","pos"};
foreach (var value in values)
{
Console.WriteLine(results[Math.Sign(value)+1]);
}
Jde to jednodušeji :-)
OdpovědětVymazatMyslím, že z principu nelze říct, že bylo nalezeno nejjednodušší řešení.
OdpovědětVymazatBylo by ale dobré definovat, jaká verze C# se může použít.
(původní příspěvek nešel editovat)
použijete jakou verzi .NET FW chcete, jednoduchým řešením se myslí co nejkratší a přehledný zápis do daného vyhrazeného místa v ukázce kódu. Není to žádný chyták, jen upozornění na některé ne přiliš známe možnosti často používaných příkazů.
OdpovědětVymazatAha takže takhle?
OdpovědětVymazatConsole.WriteLine(value.ToString("pos;neg;null"));
třeba, nebo Console.WriteLine("{0:pos;neg;null}", value);
OdpovědětVymazatOtázka je jestli to takhle je nejednodušší i pro procesor. Mnou dříve uvedený způsob se Sign a polem hodnot bude téměř jistě jednodušší než parsování nějakého format stringu. Na druhou stranu pokud by mne měl opravdu zajímat výkon tak by asi byl nejlepší klasický "switch" nebo "if". A abych byl upřímný tak klasický switch nebo if pro mne byl a bude vždy nejjednodušším a nejpřehlednějším řešením a to jednoduše proto, že pokud se na ten kód podívá nějaký jiný programátor tak pokud nebude seznámen s tou danou specifickou feature tak mu vůbec nebude jasné jak to vlastně funguje a co to dělá. Na druhou stranu se zase něco naučí a také existují komentáře, které mohou u takové věci napovědět a napsat důvod (např. chtěl jsem co nejrychlejší vyhodnocení procesorem = použil jsem metodu XY).
OdpovědětVymazatAle ono na výkonu většinou až tolik nezáleží a na stručnosti zápisu už vůbec ne, takže co je vlastně nejjednodušší? :)
to je pěkné takhle přemýšlet o kódu - to se mi líbí :-)
OdpovědětVymazatSwitch nebo if, respektive používání co nejjednodušších konstrukcí, mohou vést k rozvláčnému zápisu a následně k obtížnému čtení kódu. If bude ale zase asi nejrychlejší, tj. možná rozumným kompromisem (délka zápisu, přehlednost, výkon/zatížení PC) je pak:
Console.WriteLine(value > 0 ? "pos" : value < 0 ? "neg" : "null");
ale zase trochu trpí čitelnost...
Jak jsem napsal, chtěl jsem upozornit na ne příliš zažité možnosti.
No správně by člověk měl vzít v úvahu ještě snadnost odladění, k tomu snadnost budoucí údržby při změně zadání. Robustnost pro různé "škodlivé" vstupy.
OdpovědětVymazatA ve finále pak píše blog s názvem "I know too much to program quickly. What can I do?" , "Analysis Paralysis: Over-thinking and Knowing Too Much to Just CODE" apod. :-)
Tohle ale není finální fáze - následuje fáze, kdy už umí určit, který přístup použít, kdy psát kód jednoduše a kdy naopak robustně.
VymazatJak to udělá pak překladač bych mimo extrémní případy dnes neřešil, pro mě je nejpodstatnější čitelný kód, klidně o pár znaků delší. Nejkratší nebývá nejlepší a nejčitelnější. Myslím, že C-čkaři by mohli vyprávět, někdy jejich kód vypadá jako z obfuscatoru :-)
OdpovědětVymazat