Hoje trago aos leitores desteblog um artigo enviado pelo meu amigo Samir Lohmann. Samir e analista de sistemase desenvolvedor .NET, com larga experiencia no desenvolvimento de sistemas. Neste artigo Samir traz um exemplo pratico dautilizacao de Linq, e conta como esta ferramenta o ajudou a encontrar umasolucao elegante, simples e muito eficiente em uma rotina que escreveu. Segue o artigo:Quando aMicrosoft lancou o Linq (Language Integrated Query) no Framework 3.5, foi essaa pergunta que eu me fiz. Tudo que ele faz, consigo fazer de outras maneiras.Seria so mais uma novidade inutil adicionada ao .NET para justificar acompra/upgrade para novas versoes?Nao perdi muitotempo com esses dilemas, e ignorei o Linq por um bom tempo.Entretanto, nomeu ultimo projeto, tive um bom tempo para refatorar, ou seja, aperfeicoar ocodigo mantendo a mesma funcionalidade interna, e comecei a mudar a minhaopiniao sobre esse recurso da plataforma.Para demonstrarcomo o Linq me ajudou, vou recorrer a um exemplo. Eu tinha as seguintesclasses:''' <summary>''' Representa um item de chapa de aco, lido dosistema XXX''' </summary>''' <remarks></remarks>Public ClassStockItem Public Codigo AsString Public Material As String Public Espessura As Decimal Public Comprimento AsDecimal Public Largura As Decimal Public Sub New(ByVal pCodigo As String, ByVal pMaterial As String, ByValpEspessura As Decimal,ByVal pComprimento AsDecimal, ByValpLargura As Decimal) Codigo =pCodigo Material =pMaterial Espessura =pEspessura Comprimento =pComprimento Largura =pLargura End SubEnd Class''' <summary>''' Representa o estoque disponivel para cortedas pecas de um trabalho''' </summary>''' <remarks></remarks>Public ClassStock Inherits List(OfStockItem)End ClassAgora, vamos adicionarmanualmente alguns itens nessa lista, para efeito deste exemplo: Private SubForm1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load Dim s As New Stock() s.Add(NewStockItem("0001", "Aco Carbono SAE 1020", 9.5, 6000,2000)) s.Add(NewStockItem("0002", "Aco Carbono SAE 1045", 4.75, 6000,2440)) s.Add(NewStockItem("0003", "Aco Inox", 10, 6000, 2440)) s.Add(NewStockItem("0004", "Aco Carbono SAE 1020", 9.5, 5000, 2000)) s.Add(NewStockItem("0005", "Aco Carbono SAE 1045", 4.75, 3000,1500)) s.Add(NewStockItem("0006", "Aco Carbono SAE 1045", 4.75, 3200,1200)) End SubProblema:Na classe Stock, eu precisava de uma lista de materiais agrupados porMaterial e Espessura, ou seja, uma lista como esta:1: Material Aco Carbono SAE 1020,Espessura 9.5 mm -> 2 itens2: Material Aco Carbono SAE 1045,Espessura 4.75 mm -> 3 itens3: Material Aco Inox, Espessura10 mm -> 1 itemNao me interessava realmentequantos itens havia em cada grupo, e sim, quais grupos existiam.Como funcionava na primeiraversao:Nao vale a pena colocar o codigoaqui. Mas eu precisava de outra classe (apenas com os atributos Material eEspessura) e precisava criar uma lista de objetos dessa classe. Para popula-la,eu corria a lista de itens e, para cada um, verificava se a minha listaagrupada ja continha aquele item agrupado, se sim, eu adicionava outro item nalista. Isso tudo dava umas 70 linhas de codigo VB.Net.Como ficou na versao refatorada:Tive que adicionar 1 (UMA) linhana minha classe Stock e pude apagaras 70 originais:''' <summary>''' Representa o estoque disponivel para cortedas pecas de um trabalho''' </summary>''' <remarks></remarks>Public ClassStock Inherits List(OfStockItem) Public MateriaisAgrupados = Fromsi In Me Group By Material =si.Material, Espessura = si.Espessura Into grp= Group SelectMaterial, Espessura, grpEnd ClassEmbora a sintaxe seja uma especiede SQL com os componentes em ordem trocada, o que confunde um pouco oentendimento do codigo, eu consegui substituir 70 linhas por uma,