Qual é a maneira mais limpa de criar uma lista separada por vírgula de valores de seqüência de caracteres de um IList<string>
ou IEnumerable<string>
?
String.Join(...)
opera de string[]
maneira que pode ser complicado trabalhar quando tipos como IList<string>
ou IEnumerable<string>
não podem ser facilmente convertidos em uma matriz de cadeias.
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)
Respostas:
.NET 4+
Detalhe e soluções pré .Net 4.0
IEnumerable<string>
pode ser convertido em uma matriz de cadeia muito facilmente com LINQ (.NET 3.5):É fácil escrever o método auxiliar equivalente se você precisar:
Então chame assim:
Você pode ligar
string.Join
. Obviamente, você não precisa usar um método auxiliar:O último é um pouco de um bocado embora :)
É provável que seja a maneira mais simples de fazê-lo e também tenha um bom desempenho - há outras perguntas sobre exatamente como é o desempenho, incluindo (mas não limitado a) este .
No .NET 4.0, há mais sobrecargas disponíveis no
string.Join
, então você pode simplesmente escrever:Muito mais simples :)
fonte
List<T>
faz. Por que reinventar a roda?ToList
. É bom usarstring myStr = string.Join(",", foo.Select(a => a.someInt.ToString()))
embora.FYI, a versão .NET 4.0 do
string.Join()
possui algumas sobrecargas extras , que funcionam emIEnumerable
vez de apenas matrizes, incluindo uma que pode lidar com qualquer tipoT
:fonte
str = emps.Select(e => e.SSN).Join(",")
A maneira mais fácil de ver isso é usando o
Aggregate
método LINQ :fonte
Func<StringBuilder,string,StringBuider>
. Em seguida, basta chamarToString()
o StringBuilder retornado. É claro que não tão bonito embora :)input.Count
deve ser superior a 1.Eu acho que a maneira mais limpa de criar uma lista separada por vírgula de valores de string é simplesmente:
Aqui está um exemplo completo:
Não há necessidade de criar uma função auxiliar, isso é incorporado ao .NET 4.0 e superior.
fonte
Comparando pelo desempenho, o vencedor é "Faça um loop, sb. Anexe-o e faça o passo anterior". Na verdade, "próximo passo enumerável e manual" é o mesmo bem (considere stddev).
Código:
https://github.com/dotnet/BenchmarkDotNet foi usado
fonte
Desde que cheguei aqui enquanto procurava ingressar em uma propriedade específica de uma lista de objetos (e não o ToString ()), aqui está uma adição à resposta aceita:
fonte
Aqui está outro método de extensão:
fonte
Chegando um pouco tarde para esta discussão, mas esta é a minha contribuição fwiw. Eu tenho
IList<Guid> OrderIds
que ser convertido em uma string CSV, mas o seguinte é genérico e funciona sem modificações com outros tipos:Curto e agradável, usa StringBuilder para construir uma nova string, reduz o comprimento de StringBuilder em um para remover a última vírgula e retorna a string CSV.
Eu atualizei isso para usar vários
Append()
para adicionar string + vírgula. Pelo feedback de James, usei o Reflector para dar uma olhadaStringBuilder.AppendFormat()
. Acontece queAppendFormat()
usa um StringBuilder para construir a string de formato, o que o torna menos eficiente nesse contexto do que apenas o uso de múltiplosAppends()
.fonte
Algo um pouco fugaz, mas funciona:
Fornece a você um CSV de uma lista depois de atribuir o conversor (neste caso, d => d.DivisionID.ToString ("b")).
Hacky, mas funciona - poderia ser transformado em um método de extensão, talvez?
fonte
Aqui está o jeito que eu fiz, usando o que eu fiz em outros idiomas:
fonte
Necessidade específica quando devemos cercar por ', por ex:
fonte
Temos uma função utilitária, algo como isto:
Que pode ser usado para juntar muitas coleções facilmente:
Observe que temos o parâmetro de coleção antes do lambda porque o intellisense seleciona o tipo de coleção.
Se você já possui uma enumeração de strings, tudo o que você precisa fazer é o ToArray:
fonte
você pode converter o IList em uma matriz usando o ToArray e, em seguida, executar um comando string.join na matriz.
fonte
Eles podem ser facilmente convertidos em uma matriz usando as extensões Linq no .NET 3.5.
fonte
Você também pode usar algo como o seguinte depois de convertê-lo em uma matriz usando um dos métodos listados por outros:
Edit: Aqui está outro exemplo
fonte
Acabei de resolver esse problema antes de passar por este artigo. Minha solução é algo como abaixo:
Chamado como:
Eu também poderia ter sido tão facilmente expresso como tal e também teria sido mais eficiente:
fonte
Minha resposta é como a solução agregada acima, mas deve ter menos pilha de chamadas, pois não há chamadas delegadas explícitas:
Obviamente, pode-se estender a assinatura para ser independente do delimitador. Eu realmente não sou fã da chamada sb.Remove () e gostaria de refatorá-la para ser um loop while direto sobre um IEnumerable e usar MoveNext () para determinar se você deve ou não escrever uma vírgula. Vou mexer e postar essa solução, se eu encontrar.
Aqui está o que eu queria inicialmente:
Não é necessário armazenamento temporário de matriz ou lista e não é necessário
StringBuilder
Remove()
ouLength--
hackear.Na minha biblioteca de framework, fiz algumas variações nessa assinatura de método, todas as combinações de incluindo
delimiter
osconverter
parâmetros e com o uso de","
ex.ToString()
como padrões, respectivamente.fonte
Espero que esta seja a maneira mais simples
fonte
Eu discuti essa discussão enquanto procurava por um bom método C # para juntar strings, como é feito com o método MySql
CONCAT_WS()
. Esse método difere dostring.Join()
método, pois ele não adiciona o sinal separador se as strings forem NULL ou vazias.retornará apenas
Lastname
se o primeiro nome estiver vazio, enquantoretornará
strLastname + ", "
no mesmo caso.Desejando o primeiro comportamento, escrevi os seguintes métodos:
fonte
Eu escrevi alguns métodos de extensão para fazer isso de uma maneira eficiente:
Isso depende de
fonte
Você pode usar
.ToArray()
onLists
eIEnumerables
, e depois usarString.Join()
como quiser.fonte
Se as seqüências de caracteres que você deseja ingressar estiverem na Lista de Objetos, também poderá fazer algo assim:
fonte