Lendo e escrevendo arquivos de texto em C#

Lendo e escrevendo arquivos de texto em C#

A manipulação de arquivos de texto é uma tarefa comum em muitas aplicações. Seja para ler dados de configuração, registrar logs ou processar informações, saber como ler e escrever arquivos de texto é fundamental. O C# fornece várias ferramentas para essas tarefas. Lendo arquivos de texto Vamos começar aprendendo como ler arquivos de texto em C#. Existem diferentes abordagens para isso, dependendo do tamanho do arquivo e das suas necessidades. Usando File.ReadAllText Se você precisa ler o conteúdo completo de um arquivo de texto e o arquivo não é muito grande, o método “File.ReadAllText” é uma opção simples e direta. Ele lê todo o conteúdo do arquivo e o retorna como uma única string: string caminhoArquivo= “caminho/para/seu/arquivo.txt”; string conteudo = File.ReadAllText(caminhoArquivo); No código acima a variável “caminhoArquivo” recebe o caminho do arquivo de texto. Após isso, o método “File.ReadAllText” busca o arquivo nesse caminho, lê o conteúdo e armazena o texto na variável “conteudo”. Usando File.ReadLines Para arquivos grandes ou quando você deseja processar o arquivo linha por linha, o “File.ReadLines” é uma opção eficiente. Ele permite que você leia cada linha separadamente: string caminhoArquivo= “caminho/para/seu/arquivo.txt”; foreach (string linha in File.ReadLines(caminhoArquivo)) { Console.WriteLine(linha ); } Nesse exemplo, “File.ReadLines(caminhoArquivo)” retorna um “IEnumerable<string>” que permite iterar sobre cada linha do arquivo. A cada iteração do loop foreach, uma nova linha é lida e impressa no console com “Console.WriteLine(linha)”. Isso garante que apenas uma linha do arquivo esteja na memória de cada vez, tornando o processamento mais eficiente para arquivos grandes. Escrevendo arquivos de texto Agora que vimos como ler arquivos, vamos explorar como escrever em arquivos de texto. Dependendo do seu objetivo, você pode optar por substituir o conteúdo existente ou adicionar novo conteúdo ao final do arquivo. Usando File.WriteAllText O método “File.WriteAllText” é usado para escrever uma string em um arquivo, substituindo qualquer conteúdo existente. Se o arquivo não existir, ele será criado. string caminhoArquivo= “caminho/para/seu/arquivo.txt”; string conteudo= “Este é o novo conteúdo do arquivo.”; File.WriteAllText(caminhoArquivo, conteudo); O  “File.WriteAllText” recebe dois parâmetros: o caminho onde o arquivo está localizado ou onde ele deve ser criado e o conteúdo que deve ser gravado nesse arquivo. Usando File.AppendAllText Se você deseja adicionar texto ao final de um arquivo existente, use “File.AppendAllText”. Este método é útil para registrar logs ou adicionar informações a um arquivo sem sobrescrever o conteúdo existente. string caminhoArquivo= “caminho/para/seu/arquivo.txt”; string conteudo= “Este é o conteúdo que vai ser adicionado ao arquivo”; File.AppendAllText(caminhoArquivo, conteudo+ Environment.NewLine); Acelere a sua carreira conosco! Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET Start: Clique aqui Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET Expert: Clique aqui Conclusão Neste artigo exploramos as técnicas básicas para leitura e escrita de arquivos de texto em C#. A compreensão desses conceitos e a aplicação das melhores práticas ajudarão você a trabalhar com arquivos de texto de maneira mais eficaz em suas aplicações C#.

Interpolação de strings em C#

Interpolação de strings em C#

A interpolação de strings é um recurso muito útil e expressivo do C# que facilita a criação de cadeias de caracteres dinâmicas. Ao invés de usar métodos como “String.Format” ou concatenar as partes utilizando o operador “+”, a interpolação permite que você insira diretamente expressões em uma string de maneira clara e legível.

Cache em memória no .NET

Cache em memória no .NET

O cache em memória é uma técnica fundamental para melhorar o desempenho e a escalabilidade de aplicações.

Agrupando consultas com LINQ em C#

Agrupando consultas com LINQ em C#

Uma das operações mais comuns e úteis no LINQ é o agrupamento de dados, funcionalidade fundamental quando você precisa organizar e sumarizar registros de acordo com certas chaves.

Primary constructors em C#

Primary constructors em C#

No desenvolvimento de software orientado a objetos, a inicialização de objetos é uma tarefa muito comum. No C#, a maneira tradicional de definir construtores pode se tornar verbosa, especialmente quando você precisa inicializar muitas propriedades. Para simplificar esse processo e tornar o código mais limpo e legível, o C# introduziu o conceito de construtores primários a partir da versão 12. Este artigo explora o que são construtores primários, como usá-los e as vantagens que eles oferecem. O que são construtores primários? Construtores primários são uma nova sintaxe para criar e inicializar objetos de forma mais concisa e direta. Ao utilizar construtores primários, você pode definir parâmetros de entrada diretamente na declaração da classe e o C# automaticamente cria e inicializa as propriedades correspondentes. Esse recurso visa reduzir a quantidade de código repetitivo e melhorar a clareza do código. Sintaxe básica Antes do C# 12, a definição de construtores em classes seguia um padrão mais tradicional e detalhado. Aqui está um exemplo de como os construtores eram definidos anteriormente: public class Pessoa { public string Nome { get; } public int Idade { get; } public Pessoa(string nome, int idade) { Nome = nome; Idade = idade; } } Neste caso, você precisa definir o construtor e, em seguida, inicializar manualmente as propriedades da classe. O código inclui um bloco de construtor que atribui valores aos campos ou propriedades da classe. Se você deseja criar uma classe imutável, onde as propriedades são somente leitura, você deve utilizar apenas “get” e omitir “set”, como no exemplo acima. No entanto, se a mutabilidade for um requisito, você pode definir as propriedades com “get” e “set” e inicializá-las através do construtor primário. Com o C# 12, a mesma classe pode ser definida de forma mais concisa usando construtores primários: public class Pessoa(string nome, int idade) { public string Nome { get; } = nome; public int Idade { get; } = idade; } Aqui, “nome” e “idade” são declarados diretamente na assinatura da classe, e as propriedades são inicializadas automaticamente, eliminando a necessidade de um bloco de construtor separado. Interagindo com herança Construtores primários também interagem com a herança de maneira que simplifica o código e mantém a clareza. Vamos ver um exemplo de como os construtores primários funcionam com herança public class Pessoa(string nome, int idade) { public string Nome { get; } = nome; public int Idade { get; } = idade; } public class Funcionario(string nome, int idade, string departamento) : Pessoa(nome, idade) { public string Departamento { get; } = departamento; } Aqui, “Funcionario” herda de “Pessoa” e adiciona uma nova propriedade “Departamento”. O construtor de “Funcionario” inclui os parâmetros do construtor de “Pessoa”, permitindo que valores sejam passados para o construtor da classe base. Isso permite uma inicialização limpa e direta dos membros da classe base e da classe derivada. Acelere a sua carreira conosco! Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET Start: Clique aqui Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET Expert: Clique aqui Conclusão Os construtores primários em C# 12 oferecem uma maneira eficiente e direta de criar e inicializar objetos, simplificando a sintaxe. Comparado ao método tradicional de definição de construtores, os construtores primários tornam a criação de classes mais intuitiva e menos verbosa. Embora existam diferenças importantes na forma como os construtores primários são tratados em classes, records e structs, o conceito oferece uma ferramenta poderosa para melhorar a clareza e a eficiência do código. Ao entender e aplicar construtores primários, você pode criar código mais limpo e de fácil manutenção, aprimorando a qualidade do desenvolvimento de software.

Funções de agregação no LINQ

Funções de agregação no LINQ

No contexto de bancos de dados, as funções de agregação são usadas para resumir e calcular valores a partir de um conjunto de dados. Elas são essenciais para obter informações gerais e estatísticas, como somas, médias, máximos e mínimos. Exemplos comuns incluem funções como “SUM”, “AVG”, MAX” e “MIN”, que ajudam a transformar dados brutos em informações úteis. Em C#, o LINQ (Language Integrated Query) oferece suporte a essas mesmas operações de agregação, mas integradas diretamente à linguagem. Com o LINQ, você pode aplicar métodos de agregação a coleções de dados de maneira intuitiva e eficiente.  Neste artigo, vamos explorar esses métodos com exemplos práticos, demonstrando como utilizá-los para obter resultados específicos de maneira eficiente. Caso queira saber mais sobre métodos do LINQ, você pode acessar os artigos sobre “Três métodos LINQ essenciais para o desenvolvedor .NET” e “Métodos para recuperar um único registro no LINQ”. Max O método Max é utilizado para encontrar o maior valor em uma coleção de dados. O tipo de retorno desse método depende do tipo da coleção em que é aplicado. Por exemplo, se a coleção é de números inteiros, o retorno será um inteiro; se for de objetos, o retorno será um objeto. Esse método é útil em diversos cenários, como encontrar o preço mais alto de um produto ou o maior valor em uma lista de números. List numeros = new List { 10, 50, 30, 40, 20 }; int valorMaximo = numeros.Max(); Console.WriteLine($”O maior valor é: {valorMaximo}”); No exemplo acima, será retornado o valor 50, que é o maior elemento da lista. O método Max do LINQ é equivalente à função MAX no SQL, que é utilizada para encontrar o maior valor em uma coluna de uma tabela. Min O método Min funciona como o oposto do método Max, encontrando o menor valor em uma coleção. Isso pode ser útil para determinar, por exemplo, a data da primeira compra de um cliente, o início de um período específico, o menor valor de uma lista de produtos, etc. List datas = new List { new DateTime(2024, 3, 12), new DateTime(2024, 4, 21), new DateTime(2024, 2, 7) }; var primeiraData = datas.Min(); Console.WriteLine($”A primeira data é: {primeiraData.ToShortDateString()}”); Aqui, criamos um array de DateTime e após isso aplicamos o método Min para encontrar a menor data, que neste caso é 7 de fevereiro de 2024. É fácil perceber que este método se assemelha à função MIN da linguagem SQL. MaxBy e MinBy Enquanto os métodos Max e Min são úteis para encontrar valores máximos e mínimos avaliando o valor do próprio item da coleção como um todo, os métodos MaxBy e MinBy permitem encontrar o elemento completo que possui o valor máximo ou mínimo em uma determinada propriedade. Isso é particularmente útil quando você deseja obter o objeto completo que atende ao critério, e não apenas o valor avaliado. Por exemplo: List pessoas = new List { new Pessoa { Nome = “Ana”, Idade = 25 }, new Pessoa { Nome = “Carlos”, Idade = 30 }, new Pessoa { Nome = “Bianca”, Idade = 28 } }; Pessoa pessoaMaisVelha = pessoas.MaxBy(p => p.Idade); Pessoa pessoaMaisJovem = pessoas.MinBy(p => p.Idade); Console.WriteLine($”Pessoa mais velha: {pessoaMaisVelha.Nome}”); Console.WriteLine($”Pessoa mais jovem: {pessoaMaisJovem.Nome}”); No código acima, especificamos que queríamos encontrar a pessoa com a maior e a menor idade na lista usando a idade como parâmetro.  A pessoa com a maior idade é o Carlos, com 30 anos e a mais jovem é a Ana, com 25 anos Count O método Count nos permite determinar o número de elementos em uma coleção. Ele pode ser usado de duas formas: para contar todos os elementos ou para contar apenas aqueles que atendem a um critério específico. O tipo de retorno desse método é um int, que representa a quantidade de itens contados. Para contar todos os elementos de uma coleção, você pode usar o método Count sem passar nenhum parâmetro. Esse uso é equivalente à função COUNT(*) no SQL, que conta todas as linhas de uma tabela. List numeros = new List { 10, 20, 30, 40, 50 }; int totalNumeros = numeros.Count(); Console.WriteLine($”Total de números: {totalNumeros}”); Neste caso, a variável totalNumeros receberá o valor 5, que é a quantidade de itens na lista. Para contar apenas os elementos que atendem a um critério específico, você pode usar uma expressão lambda como parâmetro do método Count. Essa abordagem é equivalente à função COUNT com uma cláusula WHERE no SQL, que conta o número de linhas que satisfazem uma condição. List pedidos = new List { new Pedido { Id = 1, Status = “Entregue” }, new Pedido { Id = 2, Status = “Pendente” }, new Pedido { Id = 3, Status = “Entregue” }, new Pedido { Id = 4, Status = “Cancelado” } }; int quantidadePedidosEntregues = pedidos.Count(p => p.Status == “Entregue”); Console.WriteLine($”Quantidade de pedidos entregues: {quantidadePedidosEntregues}”); Em nosso exemplo, apenas dois pedidos estão registrados como entregues Sum O método Sum é utilizado para calcular a soma dos valores em uma coleção. Dependendo do tipo de coleção e dos elementos que ela contém, você pode usar o método Sum de duas maneiras: para somar todos os valores diretamente ou para somar apenas uma propriedade específica dos objetos da lista. O tipo de retorno desse método é um decimal, int, ou outro tipo numérico, conforme o tipo dos elementos da coleção. Para calcular a soma de todos os valores em uma coleção, você pode usar o método Sum diretamente sem passar nenhum parâmetro. Esse uso é equivalente à função SUM no SQL, que calcula a soma de uma coluna de uma tabela. List valores = new List { 10, 20, 30, 40, 50 }; int totalValores = valores.Sum(); Console.WriteLine($”A soma dos valores é: {totalValores}”); No exemplo acima o Sum retornará o valor 150. Já para calcular a soma de uma propriedade específica, você pode passar uma expressão lambda como parâmetro para o método Sum: List vendas = new List { new Venda { Valor = 1000 }, new