Usando LINQ com listas não genéricas

Hoje, mais uma vez eu me deparei com um “problema” relativamente comum: Usar LINQ em uma lista, coleção ou enumerável não generic (ocorre bastante quando se lida com código legado ou de aplicações mais antigas). Isso não é possível nativamente pois o LINQ trabalha apenas com generics por causa de inferencia de tipos.

Para não ter que colocar loopings no código apenas para migrar de não generico para genérico há 2 Extension methods bem simples que podemos usar:

  1. Cast<type>() – converte a coleção inteira para um IEnumerable do tipo informado. Praticamente não há impacto de performance pois internamente ele simplesmente faz um cast explicito para o tipo solicitado e devolve o objeto. O único problema deste método é que se houver algum objeto na coleção sendo convertida que não seja do tipo solicitado, ocorrerá uma exceção quando seu código chegar neste ítem.
  2. OfType<type>() – converte a coleção para um IEnumerable do tipo informado, mas contendo apenas com os ítens que são do tipo solicitado. Este é mais seguro para quando você estiver usando uma coleção que pode conter objetos de tipos diferentes mas apenas um tipo lhe interessa. Há um pequeno impacto de performance pois antes de retornar cada ítem este é testado para ver se é do tipo correto e se não for, os seguintes são testados até encontrar um que seja ou acabarem os ítens.

Ou seja, para listas de objetos em código legado não generic mas onde o tipo é conhecido e garantido, a primeria opção é melhor. Para outros casos, use a segunda. Abaixo tem um pequeno exemplo de uso desse código:

var col = new Collection();
col.Add("text");
col.Add("text2");
col.Add(1);
col.Add("text4");

var keysCast = col.Cast<string>();
var keysOfType = col.OfType<string>();

var resultadoT = (from k in keysOfType
                  select k).ToArray();

var resultadoC = (from k in keysCast
                  select k).ToArray();

Neste exemplo, o LINQ que popula resultadoT funcionará corretamente e resultadoT conterá 3 ítens, mas o LINQ de resultadoC vai gerar uma exceção ao tentar fazer cast explicito do inteiro 1 para string. Se a linha que acrescenta 1 na collection col for comentada, as duas queries LINQ funcionarão.

Tags: Dicas LINQ

\\BUILD\ Windows 2012

\\BUILD\ Windows 2012

Hoje a Microsoft finalmente anunciou a data da segunda versão do \\BUILD\, sua nova conferencia de desenvolvimento e design (substituta do PDC e MIX). A edição deste ano será no campus da Microsoft em Redmond, Washington de 30 de Outubro até 2 de Novembro.

As inscrições abrem no dia 8 de Agosto a partir das 12:00 (meio-dia) no horário de Brasília, no site http://www.buildwindows.com/. Nesse dia começarão a ser divulgadas neste mesmo site mais informações sobre as sessões e assuntos que serão apresentados no evento.

Se você (assim como eu) pretende ir, eu sugiro que faça sua inscrição no dia 8 de agosto, assim que for possível pois devido às novidades e lançamentos da Microsoft este ano e ao fato de ser em Redmond eu acredito que as vagas vão esgotar bem rápido.

Tags: Eventos Build

A importância de in-app purchases

Monetização é um assunto que tem ganhado cada vez mais importância nesse nosso mundo agora repleto de app stores. Todas as plataformas de smartphones e até SO de computadores pessoais estão começando a aderir a essa idéia de ter uma loja centralizada como principal ou até mesmo única forma de instalar aplicativos e isso traz benefícios para todos os envolvidos.

[continuar lendo]

Usando css media queries no Windows Phone 7

O desenvolvimento moderno de web sites tem introduzido tantos novos conceitos e abordagens que acaba sendo difícil para uma grande parte dos desenvolvedores se manterem atualizados.

Uma ideia que defendo com muita garra é o desenvolvimento de sites com layout fluído, capazes de identificar e se adaptarem ao dispositivo onde estão sendo exibidos. Já vi diversas tecnicas para atingir este proposito mas a maioria delas normalmente consiste em criar versões mobile do site. Eu não gosto dessa abordagem por alguns motivos:

  • normalmente são hospedadas em urls diferentes da versão “normal”
  • costumam requerer alguma forma de detectar que está em um dispositivo móvel para poder redirecionar para a url da versão móvel
  • reaproveita pouco do desenvolvimento realizado na versão “normal”
[continuar lendo]