<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nessy &#187; C#</title>
	<atom:link href="http://www.nessy.com.ar/blog/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nessy.com.ar/blog</link>
	<description>All you need is code</description>
	<lastBuildDate>Sun, 07 Feb 2010 20:51:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>C#3.0, LINQ / Expresiones Lambda</title>
		<link>http://www.nessy.com.ar/blog/2009/05/22/c30-linq-expresiones-lambda/</link>
		<comments>http://www.nessy.com.ar/blog/2009/05/22/c30-linq-expresiones-lambda/#comments</comments>
		<pubDate>Fri, 22 May 2009 15:39:08 +0000</pubDate>
		<dc:creator>Nessy</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://www.nessy.com.ar/blog/?p=81</guid>
		<description><![CDATA[
LINQ - Language Integrated Query / Expresiones Lambda
Introducido en la versión 3.0 de .NET, LINQ nos permite realizar consultas similar a las de SQL en nuestro código.
Lambda es una forma de escribir funciones anónimas en el cual se lo suele usar para pasar con facilidad como argumentos y para crear delegados.
Todo esto combinado con el [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.nessy.com.ar/blog/wp-content/uploads/2009/05/c3-linq-lambda.jpg" alt="c#3.0 - linq - lambda" title="c#3.0 - linq - lambda" width="456" height="185" class="alignnone size-full wp-image-142" /></p>
<p><b>LINQ - Language Integrated Query / Expresiones Lambda</b></p>
<p>Introducido en la versión 3.0 de .NET, LINQ nos permite realizar consultas similar a las de SQL en nuestro código.</p>
<p>Lambda es una forma de escribir funciones anónimas en el cual se lo suele usar para pasar con facilidad como argumentos y para crear delegados.</p>
<p>Todo esto combinado con el uso de los genéricos hace que el código sea simple.</p>
<p>Veamos un ejemplo de código con LINQ:</p>
<pre class="brush: csharp; gutter: false; toolbar: false;">
	Ficha ficha = (from child in Children.OfType&lt;Ficha&gt;()
				   where child.Name == &quot;_1&quot;
				   select child).First&lt;Ficha&gt;() as Ficha;
</pre>
<p>La sintaxis es idéntica al SQL, en este caso necesitábamos extraer un elemento de tipo "Ficha" con el nombre "_1" de la propiedad "Children" que devuelve una colección de objetos (En Silverlight, "Children" es una propiedad que representa un contenedor de donde desprende los elementos gráficos que se muestra en pantalla).</p>
<p>Ahora ajustando el mismo código con una expresión Lambda:</p>
<pre class="brush: csharp; gutter: false;">
	Ficha ficha = Children
				  .OfType&lt;Ficha&gt;()
				  .Where(child =&gt; child.Name == &quot;_1&quot;)
				  .First&lt;Ficha&gt;();
</pre>
<p>o simplificandolo mas:</p>
<pre class="brush: csharp; gutter: false;">
	Ficha ficha = Children
				  .OfType&lt;Ficha&gt;()
				  .Single(child =&gt; child.Name == &quot;_1&quot;);
</pre>
<p>Todo muy lindo pero el ejemplo que propuse no creo que sorprenda a los programadores Flash dado que a nivel funcional lo que quiero hacer es equivalente a "getChildByName". Osea en código AS3 seria:</p>
<pre class="brush: as3; gutter: false; toolbar: false;">
var ficha:Ficha = this.getChildByName(&quot;_1&quot;) as Ficha;
</pre>
<p><b>Leer XML con Silverlight 2</b></p>
<p>Lo que sigue ahora, sí es impresionante, el ejemplo que propongo a continuación es con Silverlight 2 y se trata de leer un XML con LINQ.</p>
<p>Tengo el XML siguiente, sites.xml:</p>
<pre class="brush: xml; gutter: false;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;main&gt;
	&lt;sites&gt;
		&lt;site
			name=&quot;Blog&quot;
			link=&quot;http://www.nessy.com.ar/blog&quot;
			thumb=&quot;thumb.blog.jpg&quot; /&gt;
		&lt;site
			name=&quot;LinkedIn&quot;
			link=&quot;http://www.linkedin.com/in/FranciscoRosales&quot;
			thumb=&quot;thumb.linkedin.jpg&quot; /&gt;
		&lt;site
			name=&quot;Twitter&quot;
			link=&quot;http://www.twitter.com/nessy&quot;
			thumb=&quot;thumb.twitter.jpg&quot; /&gt;
	&lt;/sites&gt;
&lt;/main&gt;
</pre>
<p>En consecuencia tengo el objeto siguiente:</p>
<pre class="brush: csharp; gutter: false;">
using System;

namespace NessyJackSL.model
{
	public class Site
	{
		public string name { get; set; }

		public string link { get; set; }

		public string thumb { get; set; }
	}
}
</pre>
<p>Y finalmente tengo la clase llamada JackData que se encargará de leer el XML:</p>
<pre class="brush: csharp; gutter: false;">
using System;
using System.Net;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using NessyJackSL.util;
using NessyJackSL.model;

namespace NessyJackSL.data
{
	public class JackData
	{
		public event EventHandler EVENT_DATA_READY;

		public static Site[] sites;

		public JackData()
		{
			try
			{
				WebClient client = new WebClient();
				client.OpenReadAsync(new Uri(&quot;sites.xml&quot;, UriKind.Relative));
				client.OpenReadCompleted += new OpenReadCompletedEventHandler(onComplete);
			}
			catch (Exception ex)
			{
				Log.w(&quot;JackData.Error &gt; &quot; + ex.Message);
			}
		}

		private void onComplete(object sender, OpenReadCompletedEventArgs evt)
		{
			XDocument doc = XDocument.Load((Stream) evt.Result);
			sites = (from site in doc.Descendants(&quot;site&quot;)
					 select new Site
					 {
						name = site.Attribute(&quot;name&quot;).Value,
						link = site.Attribute(&quot;link&quot;).Value,
						thumb = site.Attribute(&quot;thumb&quot;).Value
					 }).ToArray();
			EVENT_DATA_READY(this, new EventArgs());
		}
	}
}
</pre>
<p>Presten atención a lo que se hace en el código siguiente extraido de la clase JackData:</p>
<pre class="brush: csharp; gutter: false;">
			XDocument doc = XDocument.Load((Stream) evt.Result);
			sites = (from site in doc.Descendants(&quot;site&quot;)
					 select new Site
					 {
						name = site.Attribute(&quot;name&quot;).Value,
						link = site.Attribute(&quot;link&quot;).Value,
						thumb = site.Attribute(&quot;thumb&quot;).Value
					 }).ToArray();
</pre>
<p>Una vez cargado el XML sites.xml, estas pocas líneas de código efectúan las acciones siguientes:<br />
recorre los nodos con nombre "site", crea un objeto asignándole el valor que proviene del atributo que le corresponde por cada nodo encontrado y se lo agrega al Array, al final devuelve un Array de Site.</p>
<p>Ahora también lo podemos hacer con la combinación de la expresión Lambada:</p>
<pre class="brush: csharp; gutter: false;">
			sites = doc
					.Descendants(&quot;site&quot;)
					.Select(
						site =&gt; new Site
						{
							name = site.Attribute(&quot;name&quot;).Value,
							link = site.Attribute(&quot;link&quot;).Value,
							thumb = site.Attribute(&quot;thumb&quot;).Value
						}
					).ToArray();
</pre>
<p>Mi polémica  afirmación es que no he visto esta simplicidad en ningún otro lenguaje de programación conocidos pero existen desarrollos en curso para adaptarlos a los lenguajes mas populares.</p>
<p>Las opciones para Java son Quare (<a href="http://quaere.codehaus.org/" target="_blank">http://quaere.codehaus.org/</a>) y JLinq (<a href="http://www.hugoware.net/" target="_blank">http://www.hugoware.net/</a>).</p>
<p>Para ActionScript 3 es GAIQL (<a href="http://g-unix.com/blog/1/2008/05/Actionscript-Intergrated-Query-Language-Preview-Release.cfm" target="_blank">http://g-unix.com/blog/1/2008/05/Actionscript-Intergrated-Query-Language-Preview-Release.cfm</a>).</p>
<p>Para PHP se llama PHPLinq (<a href="http://phplinq.codeplex.com/" target="_blank">http://phplinq.codeplex.com/</a>).</p>
<p>Javascript parece tener su Lambda: <a href="http://alex.dojotoolkit.org/2009/05/on-js-lambdas/" target="_blank">http://alex.dojotoolkit.org/2009/05/on-js-lambdas/</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.nessy.com.ar/blog/2009/05/22/c30-linq-expresiones-lambda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
