Olá pessoal. Tudo certo?!
Um colega meu pediu ajuda para escrever um função simples. De fato, o framework já tem ela implementada.
Minha proposta foi:
var result = string.Join(@"\", that.Split('\\', '/')
.Reverse()
.SkipWhile(s => s == String.Empty)
.Skip(1)
.Reverse().ToArray()
);
Ele achou muito complexo. Você também acha!? Você saberia dizer o que esse código faz?
Você vai trocar todos os ‘\’ e ‘/’ por ‘\’ alem de tirar as combinações que sejam “//” ou “\\” e retornar somente a calda do array(tirando o elemento da cabeça), é isso?
Dados essa entrada: / a / b/c\d
Sairia isso: \ a \ b \c ?
Ele tira as \ e /, substitue por \ e tira o último segmento… acho que é pra voltar uma pasta numa URI ou Path…
Isso! é um Path.GetDirectoryName
Então, não foi dificil entender… Mas definitivamente não é como eu faria! Faria com replace, lastindexof e substring. Ou com Path.GetDirectoryName xD
Pois é, mas repare que o LastIndexOf tem suas armadilhas. Cola o código aí
(ou em um GIST)
string that = "http://elemarjr.net/2012/06/29/snippet-o-que-esse-cdigo-faz/";
var tmp = that.Trim().Replace('/', '\\');
if (tmp.Substring(tmp.Length - 1, 1) == @"\")
tmp = tmp.Substring(0, tmp.Length - 1);
int index = tmp.LastIndexOf('\\');
var result = tmp.Substring(0, index);
Ta totalmente sem verificação de erros, mas eu seguiria por este caminho, é muito mais claro o código.
Totalmente imperativo também.
Quando sentei para escrever o código, aquele foi o código que me veio a cabeça.. direto..
boa! Pretty perfect!
Separa o that por \ ou por / e depois os junta separando por \ novamente e depois reverte a string e remove os espaços em branco e depois remove 1 elemento do IEnumerable depois volta de novo a ordem antiga?
Ixi.. sei não.. complexo mesmo.
nops .. nada contra espaços em branco .. não pegou a idéia
SkipWhile(s => s == String.Empty) pensei que skip nos s em branco.
mas não é, man .. tudo para evitar a armadilha de “c:\program files\my program\”.. que geraria um item vazio na lista
great!! manda mais! rs..
Ai The Best, na verdade seu amigo pode ter achou o código muito complexo pois realizar varias rotinas de uma unica vez.
Mas se voltarmos no post anterior s == String.Empty)) e usa o .Skip(1) para ignorar o primeiro elemento.
Por ultimo ordenar a string de forma reversa.
Se extrair blocos deste código provavelmente ficaria mais claro.
Ai The Best, na verdade seu amigo pode ter achou o código muito complexo pois realizar varias rotinas de uma unica vez.
Mas se voltarmos no post anterior <a href="http://www.elemarjr.net/2012/06/26/pareando-como-voc-escreveria-esse-cdigo/" Como você escreveria esse código? Consegue deixar ele mais simples?", podemos deixar esse código mais claro.
Vou dizer o que entendi sobre o código.
Você tem uma string com o nome de that no qual é feito um split por ‘\\’ e ‘/’ que retorna um array e depois disso converte para uma string novamente usando o separador ‘\’ para concatenar a string.
Em seguida ordena a string de forma reversa.
Depois disso usa o seguinte código para retira os espaços que pode conter nessa string (.SkipWhile(s => s == String.Empty)) e usa o .Skip(1) para ignorar o primeiro elemento.
Por ultimo ordenar a string de forma reversa.
Se extrair blocos deste código provavelmente ficaria mais claro.
“The Best”, Eu?! Longe disso.
Mais de uma pessoa me deu essa dica. O que acha de “refatorar” esse código em um Gist?!
[]s
Para evitar o SkipWhile que está aí sugiro fazer com que o Split ignore elementos vazios: that.Split(new[] {‘\\’, ‘/’}, StringSplitOptions.RemoveEmptyEntries);
Muito bom! Obrigado