LINQ – Andreano Lanusse | Tecnologia e Desenvolvimento de Software http://www.andreanolanusse.com/pt Andreano Lanusse blog - artigos, tutoriais e vídeos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e técnicas de programação Tue, 08 Mar 2011 03:43:16 +0000 pt-BR hourly 1 https://wordpress.org/?v=6.5.7 “Linq para Diretórios/Arquivos” com Delphi Prism 2011 e .NET 4 http://www.andreanolanusse.com/pt/%e2%80%9clinq-para-diretoriosarquivos%e2%80%9d-com-delphi-prism-2011-e-net-4/ http://www.andreanolanusse.com/pt/%e2%80%9clinq-para-diretoriosarquivos%e2%80%9d-com-delphi-prism-2011-e-net-4/#respond Tue, 01 Jun 2010 15:49:23 +0000 http://www.andreanolanusse.com/pt/?p=946 .NET 4 nos permiti trabalhar com tipos enumerados para diretórios e arquivos através do retorno de listas (collection) a partir de métodos específicos que retornam lista de objetos DirectoryInfo, FileInfo ou FileSystemInfo, através destes objetos o desenvolvimento fica muito mais fácil. Até as versões anteriores ao .NET 4 você poderia obter essas lista como Array. […]

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
.NET 4 nos permiti trabalhar com tipos enumerados para diretórios e arquivos através do retorno de listas (collection) a partir de métodos específicos que retornam lista de objetos DirectoryInfo, FileInfo ou FileSystemInfo, através destes objetos o desenvolvimento fica muito mais fácil. Até as versões anteriores ao .NET 4 você poderia obter essas lista como Array. Enumerable collections são mais performáticos que arrays.

Delphi Prism 2011 traz suporte completo a .NET 4, os exemplos a seguir mostram como utilizar enumerar diretórios e arquivos.

Enumareting nome de diretórios – este exemplo lista todos os diretórios a partir de “c:\Program Files\”

class method ConsoleApp.Main(args: array of System.String);
begin
  try
    var dirPath: System.String := 'c:\Program Files';

    // LINQ query.
    var dirs :=  from dir in Directory.EnumerateDirectories(dirPath) select dir;

    // Show results.
    for each dir in dirs do begin
      // Remove path information from string.
      Console.WriteLine('{0}', dir.Substring(dir.LastIndexOf('\') + 1))
    end;
    Console.WriteLine('{0} directories found.', dirs.Count().ToString());

    // Optionally create a List collection.
    var workDirs: List := new List(dirs)
  except
    on UAEx: UnauthorizedAccessException do begin
      Console.WriteLine(UAEx.Message)
    end;
    on PathEx: PathTooLongException do begin
      Console.WriteLine(PathEx.Message)
    end;
  end;
  Console.ReadKey;

end;

Enumerating arquivos em todos os diretórios – este exemplo procura a palavra “license” em todos os arquivos TXT

class method ConsoleApp.Main(args: array of System.String);
begin

  try

    var files :=  from sfile in Directory.EnumerateFiles('c:\', '*.txt', SearchOption.AllDirectories)
                  from line in File.ReadLines(sfile)
                  where line.Contains('license')
                  select new class( File := sfile, Line := line);

    for each f in files do begin
      Console.WriteLine('{0}'#9'{1}', f.File, f.Line)
    end;

    Console.WriteLine('{0} files found.', files.Count().ToString());
  except
    on UAEx: UnauthorizedAccessException do begin
      Console.WriteLine(UAEx.Message);
    end;
    on PathEx: PathTooLongException do begin
      Console.WriteLine(PathEx.Message);
    end;
  end;

  Console.ReadKey;

end;

Enumerating uma coleção de objetos DirectoryInfo – este exemplo lista todos os diretórios criados antes de Abril de 2010

class method ConsoleApp.Main(args: array of string);
begin

  var dirPrograms: DirectoryInfo := new DirectoryInfo('c:\program files');
  var StartOf2010: DateTime := new DateTime(2010, 4, 1);

  // LINQ query for all directories created before April of 2010.
  var dirs :=  from dir in dirPrograms.EnumerateDirectories()
               where dir.CreationTimeUtc < StartOf2010
               select new class (ProgDir := dir);
  // Show results.
  for each di in dirs do begin
    Console.WriteLine('{0}', di.ProgDir.Name)
  end;

  Console.ReadKey;
end;

Você pode fazer o download do Delphi Prism 2011 Trial aqui.

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
http://www.andreanolanusse.com/pt/%e2%80%9clinq-para-diretoriosarquivos%e2%80%9d-com-delphi-prism-2011-e-net-4/feed/ 0
Utilizando LINQ to Objetcs em Delphi Prism http://www.andreanolanusse.com/pt/utilizando-linq-to-objetcs-em-delphi-prism-2/ http://www.andreanolanusse.com/pt/utilizando-linq-to-objetcs-em-delphi-prism-2/#comments Fri, 12 Mar 2010 18:47:34 +0000 http://www.andreanolanusse.com/pt/?p=815 Durante os últimos 10 anos as linguagens, frameworks e plataformas de desenvolvimento tiveram inúmeras evoluções, todos nós sabemos estas foram para melhor, mas em especial uma eu considero como uma das maiores inovações dos últimos 10 anos e se chama LINQ. LINQ é um conjunto de extensões para o .NET Framework que abrange operações de […]

Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

]]>
Durante os últimos 10 anos as linguagens, frameworks e plataformas de desenvolvimento tiveram inúmeras evoluções, todos nós sabemos estas foram para melhor, mas em especial uma eu considero como uma das maiores inovações dos últimos 10 anos e se chama LINQ.

LINQ é um conjunto de extensões para o .NET Framework que abrange operações de consulta integrada à linguagem, definição e transformação. Através de qualquer linguagem para .NET você pode efetuar consultas através de bibliotecas de classes para tirar proveito desses recursos.

Existem várias formas de utilização do LINQ, consultando objetos, XML e banco de dados, já existem outras implementações que permitem efetuar consulta em outros artefatos.

Para começar a entender, vou exemplificar a utilização de LINQ consultando uma lista de objetos, mais conhecido como LINQ to Objects.

O código fonte dos exemplos aqui utilizando se encontram no diretório de exemplos do Delphi Prism, pasta Linq, estes foram desenvolvidos por mim mesmo e incorporados ao produto.

Veja a classe abaixo, esta contém um Array of String, imagine a situação onde você deseja filtrar estes dados, ordenar de diversas formas e o retorno ser uma classe. Isso é o que podemos fazer com LINQ.

type
  Words = public class
  private
    words : Array of String := ['hello', 'Delphi Prism', 'wonderful', 'linq', 'beautiful', 'world' ];
  public
    method SimpleSelect;
    method ComplexSelect;
  end;

Abaixo temos a implementação do método SimpleSelect, onde utilizamos LINQ para trazer uma lista com as palavras que tenham menos de 5 caracteres.

implementation

method Words.SimpleSelect;
begin
  var shortwords := From word in words
                    Where word.Length <= 5
                    Select word;

  Console.WriteLine('Simple select statment');
  Console.WriteLine;

  for each word in shortwords do begin
    Console.WriteLine(word);
  end;

end;

Vamos passo a passo neste código, primeira parte.

  • Variável shorwords – representa uma collection de strings, neste caso, pois o retorno será string.
  • From word – nome da variável a ser utilizada para cada item selecionado no Array de String
  • in words – coleção onde será efetuada a consulta, no mundo do banco de dados seria nossa tabela
  • Where word.Length <= 5 – filtra as palavras que tenham tamanho <= 5, veja que está sendo utilizada a variável word
  • Select word – representa o item que será retornado para cada item da coleção, seria o nosso registro
  •   var shortwords := From word in words
                        Where word.Length <= 5
                        Select word;
    end;

    Desta forma temos uma coleção chamada shortwords, cria dinâmicamente e que podemos agora percorrer e apresentar os resultados da seguinte forma.

      for each word in shortwords do begin
        Console.WriteLine(word);
      end;

    Até aqui você se pergunta se é possível ordenar, agrupar, etc. A resposta é simples, sim é possível. Abaixo um exemplo onde retornamos as palavras agrupadas por tamanho, em ordem descendente e gerando o retorno como uma classe e não apenas uma string.

      var groups := From word in words
                    Order by word asc
                    Group word by word.Length into lengthGroups
                    Order by lengthGroups.Key desc
                    select new class (Length:=lengthGroups.Key,Words:=lengthGroups);

    Foi adicionado as cláusulas Order by e Group, onde Key é o tamanho da string para cada item da coleção.

    Agora uma das coisas mais interessantes é a criação dinâmica das classes através da sintaxe new class, além disso a utilização de expressões lambida onde eu defino a propriedade e valor a ser atribuído dinamicamente, exemplo abaixo Length:=lengthGroups.Key .

    select new class (Length:=lengthGroups.Key,Words:=lengthGroups);

    Caso você deseja imprimir o conteúdo agrupado, basta percorrer a variável groups, onde a propriedade Words representa a lista de palavras para cada grupo.

      for each grupo in groups do begin
        Console.WriteLine('Words of length ' + grupo.Length);
        for each word in grupo.Words do
          Console.WriteLine('   ' + word);
      end;

    Próximo post falarei sobre LINQ to XML, aguardem.

    Andreano Lanusse | Tecnologia e Desenvolvimento de Software Siga-me no Twitter: @andreanolanusse

    ]]>
    http://www.andreanolanusse.com/pt/utilizando-linq-to-objetcs-em-delphi-prism-2/feed/ 1