Dividindo uma string em linhas no .NET: 5 erros fatais e suas soluções

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que uma simples divisão de string se torna uma dor de cabeça?

\n

Parece simples, não é? O que poderia ser mais fácil do que dividir um texto em linhas? Qualquer iniciante em C# dirá: "Use string.Split('\\n') — e pronto!". Mas, na prática, essa tarefa aparentemente trivial se torna a fonte de centenas de bugs que vemos no Stack Overflow. Milhares de desenvolvedores perguntam diariamente a mesma coisa: "split a string on newlines in .NET — por que não funciona para mim?".

\n

Neste artigo, não vamos apenas dar uma receita pronta. Vamos passar pelos erros que até programadores experientes já cometeram. Você aprenderá como dividir strings corretamente, considerando diferentes plataformas, codificações e formatos de arquivo inesperados. Aperte os cintos — vai doer, mas será útil.

\n\n

Top 5 erros ao dividir uma string em linhas em C#

\n\n

1. Uso ingênuo de '\\n' — o assassino da multiplataforma

\n

O erro mais comum é codificar rigidamente o caractere de nova linha. Muitos escrevem:

\n
string text = "Primeira linha\\nSegunda linha\\nTerceira linha";\nstring[] lines = text.Split('\\n');
\n

Problema: No Windows, o separador padrão é "\\r\\n" (retorno de carro + quebra de linha), enquanto no Linux/macOS é apenas '\\n'. Se você receber um texto de um arquivo criado no Windows, seu código deixará o caractere '\\r' no final de cada linha. Resultado: "Primeira linha\\r" — e seu parser enlouquece.

\n

Solução: Use StringSplitOptions.RemoveEmptyEntries e divida por todas as variantes possíveis:

\n
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n    StringSplitOptions.RemoveEmptyEntries);
\n

Este código lida corretamente com qualquer combinação de caracteres de quebra de linha.

\n\n

2. Ignorar Environment.NewLine em tempo de execução

\n

Se você está escrevendo código que funcionará tanto no Windows quanto no Linux (por exemplo, uma aplicação ASP.NET Core), não pode confiar em constantes. Environment.NewLine retorna o separador correto para o SO atual, mas não garante que os dados de entrada correspondam a esse SO.

\n

A armadilha: Você escreve:

\n
string[] lines = text.Split(Environment.NewLine);
\n

Isso funciona apenas se o texto foi criado na mesma plataforma. Se você carregar um arquivo baixado da internet (onde as linhas podem estar no estilo Unix) — olá, bug!

\n

Melhor prática: Sempre use o método universal do ponto 1, independentemente da plataforma.

\n\n

3. Esquecer o StringSplitOptions.RemoveEmptyEntries

\n

Veja este código:

\n
string text = "Linha1\\n\\nLinha3";\nstring[] lines = text.Split('\\n');\n// Resultado: ["Linha1", "", "Linha3"]
\n

A linha vazia entre "Linha1" e "Linha3" aparece devido a dois caracteres consecutivos de nova linha. Se você estiver processando CSV, logs ou arquivos de configuração, linhas vazias podem quebrar a lógica.

\n

Solução:

\n
string[] lines = text.Split(new[] { "\\r\\n", "\\r", "\\n" }, \n    StringSplitOptions.RemoveEmptyEntries);\n// Resultado: ["Linha1", "Linha3"]
\n

Mas cuidado: se linhas vazias forem importantes (por exemplo, em texto formatado), use StringSplitOptions.None.

\n\n

4. Problema com o último caractere de nova linha

\n

Imagine que você tem um arquivo com o texto:

\n
Linha1\\nLinha2\\n
\n

Muitos esperam que, após a divisão, obtenham um array de dois elementos. Mas:

\n
string[] lines = text.Split(new[] { '\\n' }, StringSplitOptions.RemoveEmptyEntries);\n// Resultado: ["Linha1", "Linha2"]
\n

Correto. E se removermos o RemoveEmptyEntries?

\n
string[] lines = text.Split('\\n');\n// Resultado: ["Lin                

Blogs

Book Recommendations