Existe alguma maneira de formatar uma seqüência de caracteres por nome, em vez de posição em C #?
Em python, eu posso fazer algo parecido com este exemplo (descaradamente roubado daqui ):
>>> print '%(language)s has %(#)03d quote types.' % \
{'language': "Python", "#": 2}
Python has 002 quote types.
Existe alguma maneira de fazer isso em c #? Digamos, por exemplo:
String.Format("{some_variable}: {some_other_variable}", ...);
Ser capaz de fazer isso usando um nome de variável seria bom, mas um dicionário também é aceitável.
c#
.net-3.5
string-formatting
Jason Baker
fonte
fonte
Respostas:
Não existe um método interno para lidar com isso.
Aqui está um método
Aqui está outro
Um terceiro método aprimorado, parcialmente baseado nos dois acima , de Phil Haack
fonte
Tenho uma implementação que acabei de publicar no meu blog aqui: http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-parsing-and-edge-cases.aspx
Ele aborda alguns problemas que essas outras implementações têm com o escape de chaves. A postagem tem detalhes. Ele também faz o DataBinder.Eval, mas ainda é muito rápido.
fonte
Sequências interpoladas foram adicionadas ao C # 6.0 e Visual Basic 14
Ambos foram introduzidos por meio do novo compilador Roslyn no Visual Studio 2015 .
C # 6.0:
return "\{someVariable} and also \{someOtherVariable}"
OUreturn $"{someVariable} and also {someOtherVariable}"
fonte: o que há de novo no C # 6.0
VB 14:
return $"{someVariable} and also {someOtherVariable}"
Recursos dignos de nota (no IDE do Visual Studio 2015):
{index}
funciona, mas também{(index + 1).ToString().Trim()}
Aproveitar! (e clique em "Enviar um sorriso" no VS)
fonte
Você também pode usar tipos anônimos como este:
É claro que exigiria mais código se você também quiser analisar a formatação, mas pode formatar uma string usando esta função como:
fonte
Não parece haver uma maneira de fazer isso imediatamente. No entanto, parece possível implementar seus próprios
IFormatProvider
linksIDictionary
para valores.Saídas:
A ressalva é que você não pode misturar
FormatProviders
, portanto, a formatação de texto sofisticada não pode ser usada ao mesmo tempo.fonte
A estrutura em si não fornece uma maneira de fazer isso, mas você pode dar uma olhada nesta postagem de Scott Hanselman. Exemplo de uso:
Esse código de James Newton-King é semelhante e funciona com subpropriedades e índices,
O código de James baseia-se no System.Web.UI.DataBinder para analisar a cadeia e requer referência ao System.Web, o que algumas pessoas não gostam de fazer em aplicativos não-web.
EDIT: Ah, e eles funcionam bem com tipos anônimos, se você não tiver um objeto com propriedades prontas para isso:
fonte
Consulte /programming/271398?page=2#358259
Com a extensão vinculada, você pode escrever o seguinte:
e você receberá
"foo 2 System.Object
".fonte
Eu acho que o mais próximo que você vai chegar é um formato indexado:
Há também String.Replace (), se você estiver disposto a fazer isso em várias etapas e acreditar que não encontrará suas 'variáveis' em nenhum outro lugar da string:
Expandindo isso para usar uma lista:
Você também pode fazer isso com um Dictionary <string, string> iterando suas coleções .Keys, mas usando um List <KeyValuePair <string, string >>, podemos tirar proveito do método .ForEach () da List e condensá-lo novamente em uma linha:
Um lambda seria ainda mais simples, mas ainda estou no .Net 2.0. Observe também que o desempenho .Replace () não é estelar quando usado iterativamente, pois as strings no .Net são imutáveis. Além disso, isso requer que a
MyString
variável seja definida de forma que seja acessível ao delegado, para que ainda não seja perfeita.fonte
Minha biblioteca de código aberto, Regextra , suporta formatação nomeada (entre outras coisas). Atualmente, ele tem como alvo o .NET 4.0+ e está disponível no NuGet . Também tenho um post introdutório no blog: Regextra: ajudando você a reduzir seus (problemas) {2} .
O bit de formatação nomeado suporta:
Exemplo:
Resultado:
Confira o link do GitHub do projeto (acima) e o wiki para outros exemplos.
fonte
Verifique este:
Amostra:
O desempenho é bastante bom em comparação com outras soluções.
fonte
Duvido que isso seja possível. A primeira coisa que vem à mente é como você terá acesso aos nomes de variáveis locais?
No entanto, pode haver uma maneira inteligente de usar as expressões LINQ e Lambda para fazer isso.
fonte
Aqui está um que eu fiz um tempo atrás. Ele estende String com um método Format usando um único argumento. O bom é que ele usará a string padrão. Formato se você fornecer um argumento simples como um int, mas se você usar algo como um tipo anônimo, também funcionará.
Exemplo de uso:
Resultaria em "A família Smith tem 4 filhos".
Não faz coisas malucas de ligação, como matrizes e indexadores. Mas é super simples e de alto desempenho.
fonte
Exemplo:
Saída: way, wayjet, -04 04/05/2011, 第 是 你 第 18 积分 登录 , {100.40}
fonte
Aqui está um método simples para qualquer objeto:
E aqui como usá-lo:
saída: 27/2/2012
fonte
Eu implementei que esta é uma classe simples que duplica a funcionalidade de String.Format (exceto ao usar classes). Você pode usar um dicionário ou um tipo para definir campos.
https://github.com/SergueiFedorov/NamedFormatString
O C # 6.0 está adicionando essa funcionalidade diretamente nas especificações de idioma, assim
NamedFormatString
como para compatibilidade com versões anteriores.fonte
Resolvi isso de uma maneira um pouco diferente das soluções existentes. Ele faz o núcleo da substituição do item nomeado (não o bit de reflexão que alguns fizeram). É extremamente rápido e simples ... Esta é a minha solução:
É usado da seguinte maneira:
Espero que alguém ache isso útil!
fonte
Embora a resposta aceita dê alguns bons exemplos, os exemplos .Inject e alguns dos Haack não tratam de escapar. Muitos também dependem muito do Regex (mais lento) ou do DataBinder.Eval, que não está disponível no .NET Core e em alguns outros ambientes.
Com isso em mente, escrevi um analisador simples baseado em máquina de estado que transmite caracteres, gravando em uma
StringBuilder
saída, caractere por caractere. É implementado comoString
método (s) de extensão e pode levar aDictionary<string, object>
ouobject
com parâmetros como entrada (usando reflexão).Ele lida com níveis ilimitados
{{{escaping}}}
e lançaFormatException
quando a entrada contém chaves desequilibradas e / ou outros erros.Por fim, toda a lógica se resume a 10 estados principais - pois quando a máquina de estado está fora de um suporte e da mesma forma dentro de um suporte, o próximo caractere é uma chave aberta, uma chave aberta com escape, uma chave fechada, uma chave fechada, uma chave fechada com escape, ou um personagem comum. Cada uma dessas condições é tratada individualmente à medida que o loop progride, adicionando caracteres a uma saída
StringBuffer
ou chaveStringBuffer
. Quando um parâmetro é fechado, o valor da chaveStringBuffer
é usado para procurar o valor do parâmetro no dicionário, que é empurrado para a saídaStringBuffer
. No final, o valor da saídaStringBuffer
é retornado.fonte
Edit: O que eu deveria ter dito era: "Não, não acredito que o que você queira fazer seja suportado pelo C #. É o mais próximo que você conseguirá".
fonte
"someString" + someVariable + "someOtherString"
mais legível. Este artigo concorda com você.