Obtendo o index pela iteração do “foreach” (C#)

Sabemos que a iteração do “foreach” na linguagem do C# não conseguimos diretamente obter seu o index, algumas vezes temos que utilizar iterações com “for” para conseguirmos realizar tal êxito, e sua consequência é fazer indexação das propriedades dos objeto, Ex: Collection[i].PropertyName;

Neste post iremos elaborar uma Extension para conseguirmos o index dos objetos na iteração “foreach”.

Segue o código de exemplo:

1:  class Program  
2:  {  
3:    static void Main(string[] args)  
4:    {  
5:      var pessoas = new List<Pessoa>();  
6:    
7:      pessoas.Add(new Pessoa { Nome = "Fulano" });  
8:    
9:      pessoas.Add(new Pessoa { Nome = "Cicrano" });        
10:    
11:      pessoas.Each((pessoa, index) => {  
12:    
13:        Console.WriteLine("Index: {0} - Nome: {1}\n", index, pessoa.Nome);  
14:    
15:      });        
16:    }  
17:  }  
18:    
19:  class Pessoa  
20:  {  
21:    public string Nome { get; set; }  
22:  }    
23:    
24:  static class EachExtensions  
25:  {      
26:    public static void Each<T>(this IEnumerable<T> collection, Action<T, int> action)  
27:    {  
28:      int index = 0;  
29:      foreach (var obj in collection)  
30:      {  
31:        action(obj, index++);  
32:      }  
33:    }  
34:  }  

Como podemos observar o código acima, é criado uma lista de objetos do tipo Pessoa, e logo em seguida iteramos a listagem.
Analisando a classe estática “EachExtensions” nela tem o método “Each” e é através desse método que é feito a manipulação da criação dos índices nos objetos. Nesse método (Each) recebe uma “Action”, dentro desse método iteramos a collection e logo em seguida criamos suas ações, onde a ação é à indexação de cada objeto iterado.

Bom pessoal espero ter ajudado até o próximo post, abraços.

Anúncios

Entendo yield com C#

A expressão yield é utilizado como um iterador de bloco fornecendo um valor para o objeto enumerador ou para sinalizar o final da iteração, também para realização de uma iteração sobre uma coleção personalizada. Para mais informações sobre o conteúdo acesse o link http://msdn.microsoft.com/en-us/library/vstudio/9k7k7cf0.aspx.

Nesse tutorial iremos elaborar uma implementação básica, onde o retorno será composta por uma coleção de valores do tipo int. Para implementação irei utilizar o VS2012, criando assim um novo projeto do tipo ConsoleApplication, somente para fins didáticos.

Veja a implementação abaixo:

using System;
using System.Collections.Generic;

namespace SampleReturnYield
{
    class Program
    {
        static void Main(string[] args)
        {
            var numeros = ObterNumeros();

            foreach (var n in numeros)
            {
                Console.WriteLine("Sequência: {0}", n);
            }
        }

        static IEnumerable<int> ObterNumeros()
        {
            for (int i = 0; i < 10; i++)
            {
                yield return i;
            }
        }
    }    
}

Como podemos observar a implementação é bem simples, foi criado um método chamado de ObterNumeros() e tem como retorno uma coleção de IEnumerable<int>. Como já citamos acima, o retorno para yield é utilizado para um bloco do tipo IEnumerable<T>(considere o T como qualquer tipo de objeto), você também tem a liberdade de fazer iterações em cima de objetos que venha a ser criado em seus projetos.
Apesar de não mais precisarmos de uma classe auxiliar para criar o enumerador, quando utilizamos a keyword yield, automaticamente o compilador gera a classe que implementa a Interface IEnumerator, implementando todos os métodos necessários para a iteração entre os elementos da coleção. A keyword yield que determina a criação do enumerador, ainda permite uma outra forma de passar os itens para o mesmo, mantendo o mesmo resultado final.

Bom pessoal espero ter ajudado, obrigado…

Removendo Acentos utilizando Métodos de extensão com C#

Métodos de extensão permitem que você “adicione” métodos para tipos existentes sem criar um novo tipo derivado, recompilar, ou modificar o tipo original. Os métodos de extensão são um tipo especial de método estático, mas eles são chamados como se fossem métodos de instância no tipo estendido. Para o código de cliente escrito em C # ou Visual Basic, não há diferença aparente entre chamar um método de extensão e os métodos que são realmente definidos em um tipo.
Mais informações acesse http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx

Nesse tutorial iremos implementar um novo método de extensão, onde nesse método de extensão irá remover os acentos de uma determinada variável do tipo “string”. Como exemplo irei criar um novo projeto no VS2012 do tipo “Console Application”, logo abaixo segue a implementação.

Implementação e Codificação

public class Program
{
    static void Main(string[] args)
    {
        string palavra = "áéíóú";

        Console.WriteLine(palavra.RemoverAcentos());    
    }        
}

public static class StringExtensions
{
    public static string RemoverAcentos(this string valor)
    {
        byte[] bytes = Encoding.GetEncoding("Cyrillic").GetBytes(valor);

        return Encoding.ASCII.GetString(bytes);
    }
}

Como podemos observar a implementação é bem simples, criamos uma nova classe chamada StringExtensions e nela adicionamos o método de extensão chamado de RemoverAcentos(this string valor).
Com ajuda do .NET Framework, utilizaremos a classe abstract de Encoding chamando o método GetEnconding passando como parâmetro o valor Cyrillic do tipo string. Mais sobre a classe Encoding e o valor Cyrillic acesse o link http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx

Conclusão

Com implementações de métodos extensão conseguimos ganhar produtividade e organização nas funções que viram a ser implementadas.

Referências:

Bom pessoal é isso e até a próxima…