<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2spanishfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>Programación y desarrollo web</title>
	
	<link>http://www.puntopeek.com</link>
	<description>Programación en C#, PHP y software libre</description>
	<lastBuildDate>Mon, 14 May 2012 19:51:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/puntopeek" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="puntopeek" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">puntopeek</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/content?lg=es&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://eur.i1.yimg.com/eur.yimg.com/i/es/my/addto1.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.feedness.com/alta/http://feeds.feedburner.com/puntopeek" src="http://www.feedness.com/ayuda/wp-content/square_b_sh_feed.gif">Subscribe with Feedness</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/puntopeek" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2Fpuntopeek" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><item>
		<title>Sobrecarga de operadores en C#. Ejemplos</title>
		<link>http://www.puntopeek.com/codigos-c/sobrecarga-de-operadores-en-c-ejemplos/</link>
		<comments>http://www.puntopeek.com/codigos-c/sobrecarga-de-operadores-en-c-ejemplos/#comments</comments>
		<pubDate>Sun, 01 Apr 2012 11:02:44 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[ejemplos C#]]></category>
		<category><![CDATA[sobrecarga operadores]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=565</guid>
		<description><![CDATA[Como la mayoría de los lenguajes modernos, C# permite la sobrecarga de operadores, o sea la capacidad de redefinir operadores para una clase. Veamos como se redefinen operadores, su importancia y algunos ejemplos bien comentados.


Entradas relacionadas<li><a href='http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/' rel='bookmark' title='Permanent Link: Genericidad en C#. Ejemplos'>Genericidad en C#. Ejemplos</a></li>
<li><a href='http://www.puntopeek.com/tutoriales-c/herencia-programacion-en-c/' rel='bookmark' title='Permanent Link: Herencia en C#. Concepto y ejemplos'>Herencia en C#. Concepto y ejemplos</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>C#, como la mayoría de los lenguajes modernos permite la sobrecarga de operadores, o sea la capacidad de redefinir operadores para una clase. No todos los operadores pueden ser sobrecargados, además existen restricciones relativas a cuando pueden ser sobrecargados ciertos operadores, como la definición de <em>==</em> y <em>!=</em> que debe hacerse conjuntamente.</p>
<p>En la página de MSDN pueden ver la <a title="operadores que se pueden sobrecargar en C#" href="http://msdn.microsoft.com/es-es/library/8edha89s.aspx"> <strong>lista de operadores en C#</strong></a> y su posibilidad de sobrecargarse.</p>
<h2>Importancia de redefinir operadores</h2>
<p>El hecho de que C# y otros lenguajes soporten la sobrecarga de operadores no es un capricho, a través de esta característica podemos realizar operaciones complejas a través de argumentos de funciones y nos permite escribir código mucho más instuitivo y legible. En realidad definir la sobrecarga de un operador es muy similar a la declaración y definición de una función o método cualquiera. Suponiendo que tenemos una clase <em>Point</em>, veamos el siguiente código:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">        Point x <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Point <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">0</span>,<span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Point y <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Point <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>,<span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Point z1 <span style="color: #008000;">=</span> Point.<span style="color: #0000FF;">Suma</span><span style="color: #000000;">&#40;</span>x,y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>   <span style="color: #008080; font-style: italic;">//A traves de un método Suma estático de la clase Point</span>
Point z2 <span style="color: #008000;">=</span> x.<span style="color: #0000FF;">Suma</span><span style="color: #000000;">&#40;</span>y<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>          <span style="color: #008080; font-style: italic;">//A traves de un método Suma en la clase Point</span>
Point z3 <span style="color: #008000;">=</span> x <span style="color: #008000;">+</span> y<span style="color: #008000;">;</span>                 <span style="color: #008080; font-style: italic;">//Redefiniendo el operador + en la clase Point</span></pre></div></div>

<p>Seguramente estás de acuerdo conmigo en que la tercera forma es mucho más intuitiva que las otras, aunque puede que en este caso tan sencillo no se vea todavía la utilidad.</p>
<h2>Como redefinir un operador</h2>
<p>Para redefinir un operador en C#, se usa la siguiente sintaxis:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>modificadores<span style="color: #008000;">*</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#91;</span>type<span style="color: #000000;">&#93;</span> <span style="color: #0600FF;">operator</span> <span style="color: #000000;">&#91;</span><span style="color: #0600FF;">operator</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#40;</span>parámetros<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span><span style="color: #000000;">&#40;</span>…<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#125;</span></pre></div></div>

<p>Los operadores unarios reciben un solo parámetro y los binarios dos en cada caso uno de los parámetros debe ser del tipo de la clase que los redefine.<br />
<strong>*Los operadores redefinidos deben ser public static&#8230;</strong></p>
<p>Por ejemplo, para redefinir el operador <em>+</em> en la clase <em>Point</em> y usarlo como en el ejemplo anterior, sería:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> Point <span style="color: #0600FF;">operator</span> <span style="color: #008000;">+</span><span style="color: #000000;">&#40;</span>Point a, Point b<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span><span style="color: #000000;">&#40;</span>…<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#125;</span></pre></div></div>

<h2>Errores comunes</h2>
<p>1. Si se sobrecargan los operadores de comparación, dicha sobrecarga debe realizarse en parejas; es decir, si se sobrecarga <em>==</em>, también se debe sobrecargar <em>!=</em>. Lo mismo para &lt; y &gt;, y para &lt;= y &gt;=.</p>
<p>2. Si por ejemplo, estás sobrecargando el operador <em>==</em> no puedes utilizar <em>(a == b), (a == null) o (b == null)</em> para comprobar la igualdad de referencia dentro de la sobrecarga. Esto produce una llamada al operador sobrecargado ==, lo que es lo mismo que volver a llamar al operador que estás redefiniendo y como resultado se produce un ciclo infinito. Utiliza <em>ReferenceEquals</em> o convierta el tipo a <em>Object</em> para evitar esto.</p>
<h2>Ejemplo (representando un número complejo)</h2>
<p>Sabemos que un número complejo tiene una parte real y una imaginaria, y tienen una forma particular de sumarse. Tratemos de simular los números complejos a través de la clase <em>Complex</em> en C#:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// complex.cs</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Complex
<span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> real<span style="color: #008000;">;</span>
   <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> imaginary<span style="color: #008000;">;</span>
&nbsp;
   <span style="color: #008080; font-style: italic;">//Constructor de la clase</span>
   <span style="color: #0600FF;">public</span> Complex<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> real, <span style="color: #FF0000;">int</span> imaginary<span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
      <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">real</span> <span style="color: #008000;">=</span> real<span style="color: #008000;">;</span>
      <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">imaginary</span> <span style="color: #008000;">=</span> imaginary<span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
&nbsp;
   <span style="color: #008080; font-style: italic;">// Declaro cual operador será sobrecargado, los tipos que pueden ser sumados</span>
   <span style="color: #008080; font-style: italic;">// (dos objetos de tipo Complex) y el resultado será de tipo Complex</span>
   <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> Complex <span style="color: #0600FF;">operator</span> <span style="color: #008000;">+</span><span style="color: #000000;">&#40;</span>Complex c1, Complex c2<span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
      <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> Complex<span style="color: #000000;">&#40;</span>c1.<span style="color: #0000FF;">real</span> <span style="color: #008000;">+</span> c2.<span style="color: #0000FF;">real</span>, c1.<span style="color: #0000FF;">imaginary</span> <span style="color: #008000;">+</span> c2.<span style="color: #0000FF;">imaginary</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
&nbsp;
   <span style="color: #008080; font-style: italic;">// Redefinimos el operador ==, noten que podemos usar dentro de la función</span>
   <span style="color: #008080; font-style: italic;">// el operador == porque estamos comparando int con int, sino hubiera que</span>
   <span style="color: #008080; font-style: italic;">// hacer un casting</span>
   <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">bool</span> <span style="color: #0600FF;">operator</span> <span style="color: #008000;">==</span><span style="color: #000000;">&#40;</span>Complex c1, Complex c2<span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
      <span style="color: #0600FF;">return</span> c1.<span style="color: #0000FF;">real</span> <span style="color: #008000;">==</span> c2.<span style="color: #0000FF;">real</span> <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;&amp;</span>amp<span style="color: #008000;">;</span> c1.<span style="color: #0000FF;">imaginary</span> <span style="color: #008000;">==</span> c2.<span style="color: #0000FF;">imaginary</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
&nbsp;
   <span style="color: #008080; font-style: italic;">//Redefinimos el operador !=, ya que definimos antes el operador ==</span>
   <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">bool</span> <span style="color: #0600FF;">operator</span> <span style="color: #008000;">!=</span><span style="color: #000000;">&#40;</span>Complex c1, Complex c2<span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
      <span style="color: #0600FF;">return</span> <span style="color: #008000;">!</span><span style="color: #000000;">&#40;</span>c1<span style="color: #008000;">==</span>c2<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
&nbsp;
   <span style="color: #008080; font-style: italic;">// Sobrecargamos también el método ToString para mostrar el resultado de</span>
   <span style="color: #008080; font-style: italic;">// forma personalizada</span>
   <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">string</span> ToString<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
      <span style="color: #0600FF;">return</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span>.<span style="color: #0000FF;">Format</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;{0} + {1}i&quot;</span>, real, imaginary<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
&nbsp;
   <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
      Complex c1 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Complex<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2</span>,<span style="color: #FF0000;">3</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      Complex c2 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Complex<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">3</span>,<span style="color: #FF0000;">4</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
      <span style="color: #008080; font-style: italic;">// Add two Complex objects (num1 and num2) through the</span>
      <span style="color: #008080; font-style: italic;">// overloaded plus operator:</span>
      Complex sum <span style="color: #008000;">=</span> c1 <span style="color: #008000;">+</span> c2<span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #008080; font-style: italic;">// Mostremos los números y la suma usando el método</span>
	 <span style="color: #008080; font-style: italic;">// ToString sobrecargado</span>
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Primer número complejo:  {0}&quot;</span>,num1<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Segundo número complejo: {0}&quot;</span>,num2<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;La suma de los dos números es: {0}&quot;</span>,sum<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	  c1 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Complex<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>,<span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	  c2 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Complex<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>,<span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
	  Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>c1.<span style="color: #0000FF;">Equals</span><span style="color: #000000;">&#40;</span>c2<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><strong>Resultado</strong><br />
First complex number:  2 + 3i<br />
Second complex number: 3 + 4i<br />
The sum of the two numbers: 5 + 7i<br />
false</p>
<p><strong>Notas</strong><br />
En el ejemplo anterior se han sobrecargado los operadores + e ==, en el primer caso esto ha permitido hacer<br />
<code>v3 = v1 + v2</code>, lo cual es muy cómodo ya que de otra manera se hubiese tenido que definir un método Suma y hacer <code> Vector2.Suma(Vector2 sumando2)</code>.</p>
<p>En el segundo caso se ha redefinido el operador <em>==</em>, nótese que también debió ser redefinido el operador <em>!=</em> como se explicaba antes. Es decir, si se puede decir si dos objetos son iguales debe también poder decirse si son diferentes, en otros lenguajes como <em>C++</em> esto no es obligatorio.</p>
<p>En la redefinición se fue un poco más profundo en lo que es la igualdad ya que se determina realmente la igualdad entre dos objetos de tipo Vector2, recordar que por defecto en <em>C#</em> el operador <em>==</em> al igual que el método Equals compara las referencias y dos objetos de tipo Vector2 serian iguales si hacen referencia al mismo objeto. Ahora, la última línea de la salida ha dado false al evaluar <code>c1.Equals(c2)</code>, esto se debe al hecho de que una vez redefinido el operador <em>==</em> no quiere decir que se ha redefinido el método Equals en la clase base Object, lo que nos lleva a la pregunta de si sería deseable que al redefinir <em>==</em> sea redefinido también Equals y por por tanto el método <em>GetHashCode</em>.</p>
<h2>Sobrecarga explícita o implícita</h2>
<p>Veamos un último detalle de la sobrecarga de operadores acerca de los operadores de casteo. Por ejemplo el método siguiente definido dentro de la clase Fahrenheit:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">explicit</span> <span style="color: #0600FF;">operator</span> Celsius<span style="color: #000000;">&#40;</span>Fahrenheit f<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> Celsius<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>f.<span style="color: #0000FF;">degrees</span><span style="color: #008000;">-</span><span style="color: #FF0000;">32</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">/</span><span style="color: #FF0000;">1</span>,<span style="color: #FF0000;">8</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>nos permite hacer una conversión de la siguiente forma:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Fahrenheit f<span style="color: #008000;">;</span>
   ...
<span style="color: #0000FF;">Celsius</span> c <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Celsius<span style="color: #000000;">&#41;</span>f<span style="color: #008000;">;</span></pre></div></div>

<p>Es lo que se conoce como conversión explícita, que nos permite hacer la conversión de Fahrenheit a Celsius, pero veamos como podemos modificar el la sobrecarga para que el código se vea un poco más natural y legible sin hacer casting:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//Modificamos el método anterior:</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">implicit</span> <span style="color: #0600FF;">operator</span> Celsius<span style="color: #000000;">&#40;</span>Fahrenheit f<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> Celsius<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>5.0f<span style="color: #008000;">/</span>9.0f<span style="color: #000000;">&#41;</span><span style="color: #008000;">*</span><span style="color: #000000;">&#40;</span>f.<span style="color: #0000FF;">degrees</span><span style="color: #008000;">-</span><span style="color: #FF0000;">32</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Ahora podemos hacer algo como:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Fahrenheit f<span style="color: #008000;">;</span>
   ...
<span style="color: #0000FF;">Celsius</span> c <span style="color: #008000;">=</span> f<span style="color: #008000;">;</span></pre></div></div>

<p>Cualquier duda en los comentarios.</p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/' rel='bookmark' title='Permanent Link: Genericidad en C#. Ejemplos'>Genericidad en C#. Ejemplos</a></li>
<li><a href='http://www.puntopeek.com/tutoriales-c/herencia-programacion-en-c/' rel='bookmark' title='Permanent Link: Herencia en C#. Concepto y ejemplos'>Herencia en C#. Concepto y ejemplos</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/sobrecarga-de-operadores-en-c-ejemplos/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Insertar elemento en un array con C#</title>
		<link>http://www.puntopeek.com/codigos-c/insertar-elemento-en-array-c-sharp/</link>
		<comments>http://www.puntopeek.com/codigos-c/insertar-elemento-en-array-c-sharp/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 10:50:10 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[ejemplos C#]]></category>
		<category><![CDATA[ejercicios C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=555</guid>
		<description><![CDATA[Hay algunas operaciones importantes cuando trabajamos con array que provocan cambios en este. Insertar un elemento es una de ellas. En este post se verá la implementación en C# del método Inserta(a, index, valor) que asigna el valor x en la posición index del array a.


Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/mas-ejercicios-de-array-en-c/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (2)'>Ejercicios resueltos de array con C# (2)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-de-array-en-c/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (1)'>Ejercicios resueltos de array con C# (1)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-de-c-3ra-parte/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (3)'>Ejercicios resueltos de array con C# (3)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/' rel='bookmark' title='Permanent Link: El método de ordenación QuickSort'>El método de ordenación QuickSort</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de string en C#'>Ejercicios resueltos de string en C#</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>Hay algunas operaciones importantes cuando trabajamos con array que provocan cambios, por ejemplo, si tenemos un array a y un elemento <em>x</em>, haciendo<em> a[j] = x</em> se modifica el array, en este caso veremos como insertar un elemento en un array en una posición dada.</p>
<p>A continuación verás la implementación en C# del método <em>Inserta(a, index, valor)</em> que asigna el valor <em>x</em> en la posición <em>index </em>del array <em>a</em>, pero hay un detalle, y es que tenemos que desplazar los elementos a partir de la posición<em> i</em> en adelante. En este caso el elemento que esté en la última posición del array será eliminado, ya que en C#, el tamaño del array es fijo (no crece automáticamente como en otros lenguajes como Javascript) y no podemos insertar elementos en una posición negativa o que sea mayor que<em> a.Length-1</em>, que devuelve el tamaño del array &#8211; 1, ya que el primer índice del array es 0.</p>
<h2>Código en C#:</h2>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Inserta <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> a, <span style="color: #FF0000;">int</span> index, <span style="color: #FF0000;">int</span> valor<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>index<span style="color: #008000;">&gt;=</span><span style="color: #FF0000;">0</span> <span style="color: #008000;">&amp;&amp;</span> index<span style="color: #008000;">&lt;</span> a.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#123;</span>
              <span style="color: #0600FF;">for</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> a.<span style="color: #0000FF;">Length</span><span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> i<span style="color: #008000;">&gt;</span>index<span style="color: #008000;">;</span> i<span style="color: #008000;">--</span><span style="color: #000000;">&#41;</span>
		  a<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">=</span>a<span style="color: #000000;">&#91;</span>i<span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
	      a<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> valor<span style="color: #008000;">;</span>
	<span style="color: #000000;">&#125;</span>
	<span style="color: #0600FF;">else</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Posición no válida&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Si tienen alguna duda o alguna otra implementación de este método, en los comentarios por favor.</p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/mas-ejercicios-de-array-en-c/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (2)'>Ejercicios resueltos de array con C# (2)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-de-array-en-c/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (1)'>Ejercicios resueltos de array con C# (1)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-de-c-3ra-parte/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de array con C# (3)'>Ejercicios resueltos de array con C# (3)</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/' rel='bookmark' title='Permanent Link: El método de ordenación QuickSort'>El método de ordenación QuickSort</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de string en C#'>Ejercicios resueltos de string en C#</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/insertar-elemento-en-array-c-sharp/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>10+ Consejos sobre CSS</title>
		<link>http://www.puntopeek.com/diseno-web/buenas-practicas-consejos-css-html/</link>
		<comments>http://www.puntopeek.com/diseno-web/buenas-practicas-consejos-css-html/#comments</comments>
		<pubDate>Tue, 15 Nov 2011 08:45:57 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Diseño web]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=532</guid>
		<description><![CDATA[Estos son algunos consejos y buenas prácticas para aprovechar al máximo el lenguaje CSS, optimizar tus hojas de estilo y de alguna forma responder algunas preguntas que como yo, seguramente te has hecho en algún momento.


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[
<p>Algunos no creen que CSS (Cascade Style Sheets) sea un lenguaje de programación, pero junto a javascript hace de la www un lugar mejor, haciendo que nuestros diseños cobren vida y se reflejen nuestras ideas en los navegadores. Pero esto no es tan sencillo como piensan muchos.</p>
<p>El principal motivo de este post no es que aprendan CSS, sino mostrarles algunos consejos y sugerencias a tener en cuenta cuando se diseña con CSS, porque créanlo o no, todo el mundo tiene algo que decir sobre CSS.</p>
<p>1. <strong>La página debe ser usable y legible sin el CSS</strong>, teniendo en cuenta que es así como la ven los buscadores y muchos usuarios que usan navegadores de texto, o que no renderizan CSS.</p>
<p>2. <strong>Las propiedades (clases o capas) se escriben en minúsculas y sin caracteres especiales</strong>, utiliza clases cuando sea algún elemento de la página que se repite más de una vez, por ejemplo, si tienes este código HTML:</p>
<p>Código HTML:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;destacado&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>Texto Destacado <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h2</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span>&gt;</span> Este es un texto destacado, pero solo habrá uno<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span> 
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;noticia&quot;</span>&gt;</span>Esto es otra noticia dentro de la página<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;noticia&quot;</span>&gt;</span>Esta es la tercera noticia, que se repite<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">p</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;noticia&quot;</span>&gt;</span>Y esta es la cuarta noticia<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">p</span>&gt;</span></pre></div></div>

<p>Código CSS:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#destacado</span> <span style="color: #00AA00;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">red</span><span style="color: #00AA00;">;</span>
   <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #cc00cc;">#destacado</span> h2 <span style="color: #00AA00;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1.4em</span><span style="color: #00AA00;">;</span>
   <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> georgia<span style="color: #00AA00;">,</span> tahoma<span style="color: #00AA00;">,</span> <span style="color: #993333;">serif</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.noticia</span> <span style="color: #00AA00;">&#123;</span>
   <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> grey<span style="color: #00AA00;">;</span>
   <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">.9em</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<div class="small"><a href="http://willxd.com/diferencias-entre-id-y-class/">Diferencias entre id y clase</a></div>
<p>3. </strong>Tabula bien todas las clases, y comenta los bloques por secciones</strong>, un ejemplo de una clase sería algo como:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #6666ff;">.myclass</span> <span style="color: #00AA00;">&#123;</span>
       <span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">4px</span> <span style="color: #933;">20px</span><span style="color: #00AA00;">;</span>
       <span style="color: #000000; font-weight: bold;">margin-left</span><span style="color: #00AA00;">:</span> <span style="color: #933;">5px</span><span style="color: #00AA00;">;</span>
       <span style="color: #000000; font-weight: bold;">text-decoration</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
       <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>4. <strong>La mejor forma de enlazar un archivo .css desde el .html es poniendo la siguiente línea</strong> entre las etiquetas &#8220;head&#8221; del código fuente:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">&lt;link rel<span style="color: #00AA00;">=</span><span style="color: #ff0000;">'stylesheet'</span> href<span style="color: #00AA00;">=</span><span style="color: #ff0000;">'style.css'</span> type<span style="color: #00AA00;">=</span><span style="color: #ff0000;">'text/css'</span> media<span style="color: #00AA00;">=</span><span style="color: #ff0000;">'screen'</span> /<span style="color: #00AA00;">&gt;</span></pre></div></div>

<div class="small">Evita usar @import o insertar el código css junto con el de HTML</div>
<p>5. Cuando definas alguna familia de letras, <strong>añade al final algun tipo de letra genérico</strong>, como serif, sans-serif, cursive, o monospace y no hace falta que estén entre comillas. Por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"> <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> helvetica<span style="color: #00AA00;">,</span> arial<span style="color: #00AA00;">,</span> <span style="color: #993333;">sans-serif</span></pre></div></div>

<p>6. <strong>Sobre el tamaño de la letra</strong>, algunos dicen que es mejor definirlas en % o em debido a que IE no permitía hacer zoom a las letras cuando estaban definidas en pixeles, pero últimamente he leído que es mejor en pixeles.</p>
<div class="small"><a href="http://kyleschaeffer.com/best-practices/css-font-size-em-vs-px-vs-pt-vs/">Best Practices CSS Font Size</a><br />
<a href="http://www.w3.org/QA/Tips/font-size">Font Size Specification W3C</a></div>
<p>7. <strong>El objetivo de utilizar un reset.css es el de reducir inconsistencias de navegación </strong>en cosas como la altura de las líneas por defecto, los márgenes y el tamaño de las fuentes. El razonamiento general fue discutido en un<a href="http://meyerweb.com/eric/thoughts/2007/04/18/reset-reasoning"> post de Eric Meyer </a> hace unos años. Yo personalmente utilizo el <a href="meyerweb.com/eric/tools/css/reset/"> reset.css </a> desarrollado por el mismo Meyer, aunque existen muchas versiones, pero esta es la más genérica y simple.</p>
<p>8. <strong>Utiliza algún IDE potente y olvídate de la vista previa en modo de diseño</strong> al estilo Dreamweaver. Ya cuando estás escribiendo código HTML y CSS tienes que hacerlo con una idea básica. Yo personalmente uso <a href="http://www.aptana.com/products/studio3/download"> Aptana Studio </a> , que es un IDE para desarrollo web súper profesional y gratis, con autocompletado en CSS y HTML, corrección de código, por no mencionar que permite crear proyectos usando JavaScript, PHP y Ruby on Rails.</p>
<p>9. <strong>Hay algunas técnicas y patrones de diseño</strong> que pueden ayudarte a reducir la cantidad de archivos de imágenes y recursos que uses para construir tu página: <a href="www.alistapart.com/articles/slidingdoors/"> CSS Sliding Doors </a>, <a href="css-tricks.com/158-css-sprites"> CSS Sprites </a>, etc. Siempre es bueno conocer este tipo de hacks.</p>
<p>10. Es importante también últimamente <strong>mantener y preparar la hoja de estilos para impresión y dispositivos móviles</strong>, que son una importante fuente de visitas en muchos casos.</p>
<p>11. <strong>Si <a href="validator.w3.org/">validas tu código</a> a medida que editas tu CSS</strong>, te evitarás muchos dolores de cabeza al final del proceso. De igual forma, asegúrate de que esa propiedad que estás utilizando esté disponible en la mayoría de los navegadores, y si vas a usar alguna de las nuevas, por ejemplo text-shadow, tienes que hacer algo como esto:<!--/p--></p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">text-shadow</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #cc00cc;">#000</span><span style="color: #00AA00;">;</span>
-webkit-<span style="color: #000000; font-weight: bold;">text-shadow</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #cc00cc;">#000</span><span style="color: #00AA00;">;</span>
-moz-<span style="color: #000000; font-weight: bold;">text-shadow</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #933;">1px</span> <span style="color: #cc00cc;">#000</span><span style="color: #00AA00;">;</span></pre></div></div>

<div class="small">Esto se debe a que la propiedad text-shadow, está disponible para Webkit (Safari 3+), Opera 9.5, Firefox 3.1, y Konqueror, y se le añaden los prefijos –moz y –webkit para que se pongan bien en navegadores como Chrome y Firefox 3.0 o menor.</div>
<p>12. Y si quieres seguir leyendo sobre CSS, TripwireMagazine ha creado una recopilación de la mayor <a href="http://www.tripwiremagazine.com/2009/07/mega-css-resource-roundup.html"> lista de recursos </a> para CSS jamás mostrada. En ella se enumeran <strong>más de 155 recursos hacks y tutoriales</strong>.</p>



<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/diseno-web/buenas-practicas-consejos-css-html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Identificar subcadenas en C#</title>
		<link>http://www.puntopeek.com/codigos-c/saber-palabra-subcadena-ejercicio-string-c-sharp/</link>
		<comments>http://www.puntopeek.com/codigos-c/saber-palabra-subcadena-ejercicio-string-c-sharp/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 09:09:21 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[ejemplos C#]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=517</guid>
		<description><![CDATA[Como saber en C# si una palabra contiene una subcadena dada. Por ejemplo, la palabra "puntopeek" contendrá la subcadena "peek"? En este post veremos un algoritmo bastante sencillo y podrás descargar el código de este y otros ejemplos del trabajo con String en C#.


Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/la-clase-string-en-c/' rel='bookmark' title='Permanent Link: La clase String en C#'>La clase String en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de string en C#'>Ejercicios resueltos de string en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/tres-formas-de-invertir-un-string/' rel='bookmark' title='Permanent Link: Tres formas de Invertir un String'>Tres formas de Invertir un String</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>En este post veremos como saber en C# si una palabra contiene una subcadena dada. Por ejemplo, &#8220;puntopeek&#8221; contiene la subcadena &#8220;peek&#8221;? Para solucionar este problema, seguiremos la siguiente idea:</p>
<h2>Algoritmo</h2>
<p>1. Buscamos los dos primeros caracteres que coincidan<br />
2. A partir de esa posicion recorremos la palabra hasta ver si coincide completamente<br />
3. Si no coinciden, volvemos al paso 1</p>
<h2>Código en C# </h2>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">bool</span> Contiene<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> palabra, <span style="color: #FF0000;">string</span> cadena<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;=</span> palabra.<span style="color: #0000FF;">Length</span><span style="color: #008000;">-</span>cadena.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
		<span style="color: #008080; font-style: italic;">//Si encontramos dos letras iguales</span>
		<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>palabra<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #008000;">==</span>cadena<span style="color: #000000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #FF0000;">bool</span> contenida <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
			<span style="color: #008080; font-style: italic;">//Recorremos la cadena desde la posición 1</span>
			<span style="color: #008080; font-style: italic;">//y comparamos con la palabra a partir de </span>
			<span style="color: #008080; font-style: italic;">//la posición donde las dos letras iguales</span>
			<span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> j <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> j <span style="color: #008000;">&lt;</span> cadena.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span> j<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
				<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>palabra<span style="color: #000000;">&#91;</span>i <span style="color: #008000;">+</span> j<span style="color: #000000;">&#93;</span> <span style="color: #008000;">!=</span> cadena<span style="color: #000000;">&#91;</span>j<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>
					contenida <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
			<span style="color: #008080; font-style: italic;">//Si esta contenida</span>
			<span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>contenida<span style="color: #000000;">&#41;</span> 
				<span style="color: #0600FF;">return</span> true<span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #008080; font-style: italic;">//Si no está contenida</span>
	<span style="color: #0600FF;">return</span> false<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<h2> Notas </h2>
<p>Es importante notar que aunque String, es una clase en C#, se puede tratar como un array de caracteres, y que el for se hace hasta palabra.Length-subcadena.Length, para que no de excepción. Si quieres saber más sobre este tema, puedes ver un post que escribí hace un tiempo sobre <a href="http://www.puntopeek.com/tutoriales-c/la-clase-string-en-c/">la clase String en C#</a>. También hay que decir que este ejercicio se puede hacer de otra forma más eficiente usando String Matching y algoritmos como KMP, pero no es el objetivo de este post.</p>
<p>Creo que el código está bien comentado, pero cualquier pregunta en los comentarios.</p>
<h2>Descargar Ejemplo</h2>
<p>Puedes <a href="http://www.puntopeek.com/wp-content/uploads/2011/10/String.zip">descargar este y otros ejemplos de string usando C#</a></p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/la-clase-string-en-c/' rel='bookmark' title='Permanent Link: La clase String en C#'>La clase String en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/ejercicios-resueltos-string-en-c-sharp/' rel='bookmark' title='Permanent Link: Ejercicios resueltos de string en C#'>Ejercicios resueltos de string en C#</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/tres-formas-de-invertir-un-string/' rel='bookmark' title='Permanent Link: Tres formas de Invertir un String'>Tres formas de Invertir un String</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/saber-palabra-subcadena-ejercicio-string-c-sharp/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>LINQ con C#. Ejemplos</title>
		<link>http://www.puntopeek.com/programacion/linq-c-sharp-ejemplos-caracteristicas/</link>
		<comments>http://www.puntopeek.com/programacion/linq-c-sharp-ejemplos-caracteristicas/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 02:53:23 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=491</guid>
		<description><![CDATA[En el último post les estaba hablando sobre una de las nuevas características de C#, los métodos extensores. En esta ocasión veremos algunas características y ejemplos sobre otra nueva característica de C# para trabajar con fuentes de datos: LINQ.


Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/herencia-programacion-en-c/' rel='bookmark' title='Permanent Link: Herencia en C#. Concepto y ejemplos'>Herencia en C#. Concepto y ejemplos</a></li>
<li><a href='http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/' rel='bookmark' title='Permanent Link: Genericidad en C#. Ejemplos'>Genericidad en C#. Ejemplos</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/sobrecarga-de-operadores-en-c-ejemplos/' rel='bookmark' title='Permanent Link: Sobrecarga de operadores en C#. Ejemplos'>Sobrecarga de operadores en C#. Ejemplos</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>Casi todas las aplicaciones medianamente serias, necesitarán en algún momento acceder y consultar una base de datos, para luego convertir estos datos en objetos y trabajar con ellos.</p>
<p>Pues bien, si ya llevas algún tiempo programando, habrás notado que esto de extraer los datos de la fuente de datos y tratarlos como objetos es algo complicado, sobre todo porque existen buenas diferencias entre las bases de datos relacionales y los lenguajes orientados a objetos como <em>C#.</em></p>
<p>Se han diseñado unas cuantas herramientas <em>ORM</em> (Object-Relational mapping) para resolver este problema (crear una base de datos orientada a objetos virtual), pero casi siempre dejan algo que desear, y hoy por hoy, a pesar de haber unas cuantas herramientas de uso libre y comercial, muchos programadores prefieren usar sus propias bibliotecas para trabajar con fuentes de datos.</p>
<p>En este contexto es que nace la idea de <em>LINQ</em> (Language INtegrated Query), en principio una herramienta más para dar solución al problema del mapeo objeto-relacional (ORM) y simplificar la interacción entre objetos y fuentes de datos (XML, ADO.Net, RDBMS), quién luego se convirtió en un conjunto de herramientas de consulta integrado en varios lenguajes de la plataforma .Net.</p>
<p><em>LINQ</em> es un cambio en la forma de manejar y manipular los datos, permite el acceso a cualquier fuente de datos (<em>LINQ to Objects</em>, <em>LINQ to SQL</em>,<em> LINQ to DataSets</em>), mezclar datos de diferentes fuentes con una sintaxis muy sencilla, comprobar en tiempo de compilación las consultas, el uso de IntelliSense de Visual Studio y un enfoque declarativo para escribir códigos más cortos y sencillos. Funciona a partir de <em>C# 3.0</em> y <em>VB.Net 9.0</em> ya que requiere de ayuda por parte del compilador.</p>
<p>En realidad <em>LINQ</em> lo que provee es una capa intermedia entre la fuente de dato y el cliente, por decirlo de alguna forma. Gracias a esta abstracción es que podemos trabajar de la misma forma con <em>LINQ </em>sin importar que la fuente de datos sea un archivo <em>XML</em> o una base de datos.</p>
<p>Bueno,  vamos a ver algunos códigos y ejemplos de consultas <em>LINQ </em>y su ventaja frente a las consultas imperativas que se hacen con <em>C#</em> y a otras.</p>
<p><small>Nota: Para este ejemplo, vamos a suponer que tenemos ya una base de datos llamada <em>Personal </em>mapeada a un conjunto de clases como sigue. Noten que en muchos casos esto se puede hacer de forma automática con <em>Visual Studio</em>. </small></p>
<p>Esta sería la estructura de la clase que hace referencia a la base de datos:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>Table<span style="color: #000000;">&#40;</span>Name<span style="color: #008000;">=</span><span style="color: #666666;">&quot;Personas&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #FF0000;">class</span> Persona
<span style="color: #000000;">&#123;</span>
     <span style="color: #000000;">&#91;</span>Column<span style="color: #000000;">&#40;</span>IsPrimaryKey<span style="color: #008000;">=</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
      <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> ID<span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #000000;">&#91;</span>Column<span style="color: #000000;">&#40;</span>Name<span style="color: #008000;">=</span><span style="color: #666666;">&quot;ContactName&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
      <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Nombre<span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #000000;">&#91;</span>Column<span style="color: #000000;">&#40;</span>Name<span style="color: #008000;">=</span><span style="color: #666666;">&quot;ContactAge&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
      <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Edad<span style="color: #008000;">;</span>
&nbsp;
     <span style="color: #000000;">&#91;</span>Column<span style="color: #000000;">&#93;</span>
      <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Ocupación<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Ahora vamos a obtener todas las personas que tengan menos de 30 años y que sean abogados usando LINQ:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">var consulta <span style="color: #008000;">=</span>
            from persona <span style="color: #0600FF;">in</span> db.<span style="color: #0000FF;">GetTable</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            where persona.<span style="color: #0000FF;">Edad</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">30</span> <span style="color: #008000;">&amp;&amp;</span> persona.<span style="color: #0000FF;">Ocupacion</span><span style="color: #008000;">==</span>”abogado”
            select persona<span style="color: #008000;">;</span></pre></div></div>

<p>Y así ya dejamos de tener que hacer las consultas SQL aquellas que nos complicaban la vida, ahora todo es mucho más sencillo, y podemos mantener las mismas consultas sin importar que fuente de dato se esté usando. En el MSDN hay <a href="http://msdn.microsoft.com/en-us/vcsharp/aa336746">unos cuantos buenos ejemplos de LINQ</a>. Terminaré con una frase que describe en dos líneas la idea esencial de LINQ:</p>
<blockquote><p>“Before LINQ it was like you had to order your dinner in one language and drinks in another”<br />
Jason McConnel, Product Manager for Visual Studio at Microsoft</p></blockquote>
<h2>Para seguir leyendo sobre LINQ:</h2>
<p><a href="http://download.damieng.com/dotnet/LINQToSQLCheatSheet.pdf" target="_blank">Hoja de Trucos de LINQ to SQL</a><br />
<a href="http://www.devtroce.com/2009/12/19/un-ejemplo-practico-de-linq-y-c/">Ejemplo práctico con LINQ y C#</a><br />
<a href="http://speakingin.net/tutorial-de-linq-to-sql/">Tutorial de LINQ to SQL </a>*</p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/tutoriales-c/herencia-programacion-en-c/' rel='bookmark' title='Permanent Link: Herencia en C#. Concepto y ejemplos'>Herencia en C#. Concepto y ejemplos</a></li>
<li><a href='http://www.puntopeek.com/programacion/genericidad-ejemplos-c-sharp/' rel='bookmark' title='Permanent Link: Genericidad en C#. Ejemplos'>Genericidad en C#. Ejemplos</a></li>
<li><a href='http://www.puntopeek.com/codigos-c/sobrecarga-de-operadores-en-c-ejemplos/' rel='bookmark' title='Permanent Link: Sobrecarga de operadores en C#. Ejemplos'>Sobrecarga de operadores en C#. Ejemplos</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/programacion/linq-c-sharp-ejemplos-caracteristicas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Métodos extensores en C#</title>
		<link>http://www.puntopeek.com/codigos-c/metodos-extensores-en-c-sharp-net/</link>
		<comments>http://www.puntopeek.com/codigos-c/metodos-extensores-en-c-sharp-net/#comments</comments>
		<pubDate>Sat, 09 Jul 2011 09:07:29 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[ejemplos C#]]></category>
		<category><![CDATA[metodos extensores]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=480</guid>
		<description><![CDATA[
Los métodos extensores son un recurso de C# a partir de la versión 3.0 y permite añadir métodos a tipos ya definidos sin tener que crear un tipo heredero, recompilar o modificar al tipo original de una forma muy sencilla &#8230; <a href="http://www.puntopeek.com/codigos-c/metodos-extensores-en-c-sharp-net/">seguir leyendo &#187;</a></p>


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[
<p>Los métodos extensores son un recurso de C# a partir de la versión 3.0 y permite <strong>añadir métodos a tipos ya definidos</strong> sin tener que crear un tipo heredero, recompilar o modificar al tipo original de una forma muy sencilla y con una sintaxis casi idéntica a la forma tradicional de declarar un método. En otras palabras, si queremos añadirle una funcionalidad a una clase o tipo ya definido anteriormente, no tendremos que modificarla, al no ser que vayamos a usar variables privadas de la clase o cosas por el estilo.</p>
<p>Se definen como <strong>métodos estáticos pertenecientes a una clase estática y no genérica</strong>; pero se llaman de la forma tradicional, como métodos de una instancia de una clase.</p>
<p>Se les pasa como primer parámetro this seguido del tipo de la clase a la cual se va a añadir el método; aquí tenemos un ejemplo de añadirle un método a la clase String de .Net:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">class</span> MyExtensions
<span style="color: #000000;">&#123;</span>
     <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> WordCount<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> <span style="color: #FF0000;">String</span> str<span style="color: #000000;">&#41;</span>
     <span style="color: #000000;">&#123;</span>
         <span style="color: #008080; font-style: italic;">//Split separa la cadena en un array de string utiizando los separadores especificados</span>
         <span style="color: #0600FF;">return</span> str.<span style="color: #0000FF;">Split</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">char</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> <span style="color: #666666;">' '</span>, <span style="color: #666666;">'.'</span>, <span style="color: #666666;">'?'</span>, <span style="color: #666666;">';'</span> , <span style="color: #666666;">':'</span> <span style="color: #000000;">&#125;</span>, StringSplitOptions.<span style="color: #0000FF;">RemoveEmptyEntries</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Length</span><span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Utilizando este ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">  <span style="color: #FF0000;">string</span> s <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;hello extension methods!&quot;</span><span style="color: #008000;">;</span>
  <span style="color: #FF0000;">int</span> count <span style="color: #008000;">=</span> s.<span style="color: #0000FF;">WordCount</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
  <span style="color: #008080; font-style: italic;">//Este código imprime: 3</span></pre></div></div>

<p>Este método podrá ser usado en todas las variables de tipo string,<strong> IntelliSense también los reconoce</strong> ya que no violan los principios de encapsulación, pues en realidad <strong>no modifican a la clase ni acceden a sus variables privadas</strong>.</p>
<p>Los métodos extensores se usan para extender una clase o interface; pero no para sobreescribirla. Un método extensor con el mismo nombre y signatura (parámetros) que un método de la clase o la interface, nunca será llamado: en tiempo de compilación, los métodos extensores <strong>tienen menor prioridad que los métodos definidos en el propio tipo</strong> y están definidos en el ámbito del namespace.</p>
<p>Veamos otro ejemplo un poco más complejo usando interfaces y genericidad:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//Este método devuelve el mayor de una colección que sea </span>
<span style="color: #008080; font-style: italic;">//IEnumerable(List, array, LinkedList, etc)</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> T Mayor<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> IEnumerable items<span style="color: #000000;">&#41;</span> where T <span style="color: #008000;">:</span> IComparable
    <span style="color: #000000;">&#123;</span>
      T max <span style="color: #008000;">=</span> <span style="color: #0600FF;">default</span><span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #FF0000;">bool</span> empty <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
      <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>T x <span style="color: #0600FF;">in</span> items<span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
        max <span style="color: #008000;">=</span> x<span style="color: #008000;">;</span> empty <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>  break<span style="color: #008000;">;</span>
      <span style="color: #000000;">&#125;</span>
      <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>empty<span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;The source cannot be empty&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
      <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>T x <span style="color: #0600FF;">in</span> items<span style="color: #000000;">&#41;</span>
      <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>x.<span style="color: #0000FF;">CompareTo</span><span style="color: #000000;">&#40;</span>max<span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
          max <span style="color: #008000;">=</span> x<span style="color: #008000;">;</span>
      <span style="color: #000000;">&#125;</span>
      <span style="color: #0600FF;">return</span> max<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span></pre></div></div>

<p>Como en el caso anterior, ahora en todas las clases que implementen la interfaz IEnumerable donde sus elementos se puedan comparar, tendremos un método Mayor, que devuelve el mayor elemento de la colección de objetos de tipo T genérico. Veamos algunos ejemplos de como usar este método:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> numeros <span style="color: #008000;">=</span> <span style="color: #000000;">&#123;</span> <span style="color: #FF0000;">10</span>, <span style="color: #008000;">-</span><span style="color: #FF0000;">60</span>, <span style="color: #FF0000;">20</span>, <span style="color: #008000;">-</span><span style="color: #FF0000;">50</span>, <span style="color: #FF0000;">30</span>, <span style="color: #008000;">-</span><span style="color: #FF0000;">40</span> <span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>numeros.<span style="color: #0000FF;">Mayor</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">=;</span>
<span style="color: #008080; font-style: italic;">//se va a imprimir 30</span></pre></div></div>

<p>Otro ejemplo podría ser:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">List colores <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List <span style="color: #000000;">&#123;</span> <span style="color: #666666;">&quot;rojo&quot;</span>, <span style="color: #666666;">&quot;verde&quot;</span>, <span style="color: #666666;">&quot;azul&quot;</span>, <span style="color: #666666;">&quot;blanco&quot;</span>, <span style="color: #666666;">&quot;negro&quot;</span><span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>colores.<span style="color: #0000FF;">Mayor</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">//se va a imprimir verde, que es el mayor en orden alfabético</span></pre></div></div>

<p>Bueno, si quieren ver más ejemplos aquí les dejo unos cuantos <a href="http://www.puntopeek.com/wp-content/uploads/2011/07/metodos-extensores.zip">métodos extensores en C# para descargar</a> con sus probadores y todo, para que practiques y le saques el mayor partido a esta nueva característica de C#. Si tienes alguna duda, propuesta o no entiendes algo en los comentarios por favor. Proximamente estaremos hablando de LINQ, otra de las nuevas características de C# y .Net.</p>



<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/metodos-extensores-en-c-sharp-net/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Aplicaciones de Consola en C#</title>
		<link>http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/</link>
		<comments>http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 10:07:36 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Tutoriales C#]]></category>
		<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[ejemplos C#]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=462</guid>
		<description><![CDATA[
El principal motivo de este post, es que la mayor parte de los que leen este blog no saben como interactuar con el usuario a través de la consola (lo cual es comprensible), y no tienen una forma dinámica de &#8230; <a href="http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/">seguir leyendo &#187;</a></p>


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[
<p>El principal motivo de este post, es que la mayor parte de los que leen este blog no saben como interactuar con el usuario a través de la consola (lo cual es comprensible), y no tienen una forma dinámica de probar sus códigos. Generalmente cuando nos enseñan a programar, parten de la parte de como crear métodos, la sintaxis del lenguaje, las estructuras de control (for, foreach, etc) y se pasan por alto la parte de como crear una aplicación, donde el usuario vea resultados a traves de la consola. Bueno, empecemos desde 0:</p>
<h3>Crear una aplicación de Consola:</h3>
<p>Para esto, deberemos ir a File-&gt;New-&gt;Project si usas Visual Studio, pero con cualquier otro IDE debe ser algo parecido. Entonces se mostrará una nueva ventana como la de la figura, seleccionamos C# en el menu izquierdo y luego como tipo de proyecto marcamos &#8220;Console Apliccation&#8221;, le ponemos un nombre al proyecto y le damos Ok. Ya estaremos listos para empezar con el código.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2011/06/screenshot.jpg"><img class="alignnone size-full wp-image-463" title="new-console-apliccation" src="http://www.puntopeek.com/wp-content/uploads/2011/06/screenshot.jpg" alt="screenshot Aplicaciones de Consola en C#" width="566" height="342" /></a></p>
<h3>Métodos útiles para trabajar con la consola</h3>
<p>Para interactuar con el usuario es que existen algunos métodos básicos cuando trabajamos con la Consola. Veamos los más usados:</p>
<p><strong>1- Console.WriteLine();</strong><br />
Escribe una nueva linea en la consola, es como presionar Enter y escribir una linea. Por ejemplo, podemos hacer:<br />
Console.WriteLine(&#8220;Lo que quiera q salga en la consola&#8221;);<br />
También podremos imprimir las variables de nuestro programa, para esto hay dos formas, pero veamos mejor dos ejemplos que son lo mismo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">//declaramos dos variables</span>
<span style="color: #FF0000;">string</span> nombre <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Invitado&quot;</span><span style="color: #008000;">;</span>
<span style="color: #FF0000;">int</span> edad <span style="color: #008000;">=</span> <span style="color: #FF0000;">22</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">//Imprimimos una linea en la consola de dos formas distintas</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Tu nombre es: &quot;</span><span style="color: #008000;">+</span>nombre<span style="color: #008000;">+</span><span style="color: #666666;">&quot; y tienes &quot;</span> <span style="color: #008000;">+</span> edad <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; años.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">//En C# se usa el operador + para concatenar cadenas</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Tu nombre es {0} y tienes {1} años&quot;</span>, nombre, edad<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Como ven la segunda vía es mucho más simple, solo debes recordar que el numero que está entre cochetes, es el indice del parámetro que se pasa al final del método.<br />
<strong>2- Console.Write()</strong><br />
Hace casi lo mismo que Console.WriteLine() pero sin cambiar de línea, o sea&#8230; concatena el texto que le pasemos al método con lo que se haya escrito hasta ese momento en la consola.</p>
<p><strong>3- Console.ReadLine()</strong><br />
Se usa para leer lo que el usuario escribió en la consola, y podemos guardarlo en una variable para despues usarlo en nuestro programa. No hay que pasarle ningún parámetro y el programa solo continuará cuando el usuario teclee alguna línea y presione Enter. Podemos hacer algo como esto:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Escriba su nombre&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #FF0000;">string</span> nombre <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>Importante: Si lo que queremos es recoger lo que el usuario escriba como un tipo en específico, por ejemplo, un entero, deberemos usar el método estático int.Parse, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">int</span> x <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>ya que lo que devuelve Console.ReadLine() es un string.</p>
<p><strong>4-Console.ReadKey()</strong><br />
Este método resulta importante algunas veces, sobre todo cuando queremos darle varias opciones al usuario (a, b, c, d). Aunque se puede utilizar Console.ReadLine(). En este caso, este método lo que devuelve es un objeto de tipo ConsoleKeyInfo, y se puede utilizar de la siguiente forma, por ejemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Presiona una tecla&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
ConsoleKeyInfo c <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadKey</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Presionaste la tecla &quot;</span><span style="color: #008000;">+</span> c.<span style="color: #0000FF;">KeyChar</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<h3Interactuando con el usuario</h3>
<p>Bueno, estos son algunos de los métodos más importantes. Veamos ahora como está compuesto un proyecto de tipo consola. Lo primero que vemos es el namespace que se llama igual que el proyecto, luego vemos que hay una clase Program, la cual se llama así por defecto y dentro de esta, un método Main() con la siguiente signatura:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span></pre></div></div>

<p>
Este es el punto de entrada de nuestra aplicación, el método se llama así por defecto y no se debe cambiar ni añadir ningún parámetro. Bueno, vamos ya a escribir un poco de código, como ejemplo, vamos a calcular la edad de un usuario pidiendole que nos diga el año de nacimiento. Para esto crearemos otro método estático (dentro de Program) que le pasaremos un año de nacimiento y calcula la edad. Veamos:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">int</span> DameEdad<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> dia, <span style="color: #FF0000;">int</span> mes, <span style="color: #FF0000;">int</span> año<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
     <span style="color: #008080; font-style: italic;">//Usamos la clase DateTime y un método estatico para restar fechas</span>
     DateTime fecha_nacimiento <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DateTime<span style="color: #000000;">&#40;</span>año, mes, dia<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     TimeSpan edad <span style="color: #008000;">=</span> DateTime.<span style="color: #0000FF;">Now</span>.<span style="color: #0000FF;">Subtract</span><span style="color: #000000;">&#40;</span>fecha_nacimiento<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>edad.<span style="color: #0000FF;">Days</span><span style="color: #008000;">/</span><span style="color: #FF0000;">365</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Este método hace uso de la clase DateTime de .Net, que tiene muchas funcionalidades, entre ellas permite restar dos fechas, lo cual sería un algoritmo un poco pesado de programar (no es tan sencillo como restar los años). Cuando hacemos DateTime.Now, accedemos a la fecha actual que tenemos en nuestra PC, por ultimo devolvemos la cantidad de dias que han pasado entre las dos fechas y lo dividimos entre la cantidad de dias que tiene un año.</p>
<p>Ahora veamos como programar el método Main para interactuar con el usuario, pedirle la fecha, y encargarnos que la introduzca correctamente. El código sería algo así:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">//Variables que usaremos para la fecha de nacimiento</span>
    <span style="color: #FF0000;">int</span> dia_nacimiento, mes_nacimiento, año_nacimiento<span style="color: #008000;">=</span><span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Escriba su nombre&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #FF0000;">string</span> nombre <span style="color: #008000;">=</span> Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Hola {0}, bienvenido a mi aplicacion!&quot;</span>,nombre<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Por favor, introduce tu fecha de nacimiento:&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008080; font-style: italic;">//El while solo termina cuando se hace break</span>
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//Pedimos el dia y lo validamos</span>
        Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Dia de nacimiento: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        dia_nacimiento <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>dia_nacimiento <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">1</span> <span style="color: #008000;">||</span> dia_nacimiento <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">31</span><span style="color: #000000;">&#41;</span>
             Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Por favor, especifique un dia entre 1 y 31&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">else</span>
             <span style="color: #008080; font-style: italic;">//Si el dia es valido, entonces pasamos a pedir el mes</span>
             break<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//Pedimos el mes y lo validamos</span>
        Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Mes de nacimiento: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        mes_nacimiento <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>mes_nacimiento <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">1</span> <span style="color: #008000;">||</span> mes_nacimiento <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">12</span><span style="color: #000000;">&#41;</span>
             Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Por favor, especifique un mes entre 1 y 12&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">else</span>
             break<span style="color: #008000;">;</span>
    <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span><span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">//Pedimos el año y lo validamos</span>
        Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Año de nacimiento: &quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        año_nacimiento <span style="color: #008000;">=</span> <span style="color: #FF0000;">int</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">ReadLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008080; font-style: italic;">//El año no puede ser posterior a 1900 y anterior al año actual</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>año_nacimiento <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">1900</span> <span style="color: #008000;">||</span> año_nacimiento <span style="color: #008000;">&gt;</span> DateTime.<span style="color: #0000FF;">Now</span>.<span style="color: #0000FF;">Year</span><span style="color: #000000;">&#41;</span>
             Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Por favor, especifique un año entre 1900 y el {0}&quot;</span>, DateTime.<span style="color: #0000FF;">Now</span>.<span style="color: #0000FF;">Year</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">else</span>
             break<span style="color: #008000;">;</span>
     <span style="color: #000000;">&#125;</span>
     <span style="color: #008080; font-style: italic;">//Si llegamos aqui, es porque tenemos una fecha correcta, vamos a calcular la edad con</span>
     <span style="color: #008080; font-style: italic;">//el método DameEdad() que escribimos antes</span>
     <span style="color: #FF0000;">int</span> edad <span style="color: #008000;">=</span> DameEdad<span style="color: #000000;">&#40;</span>dia_nacimiento, mes_nacimiento,año_nacimiento<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>nombre<span style="color: #008000;">+</span><span style="color: #666666;">&quot;, usted tiene &quot;</span> <span style="color: #008000;">+</span> edad <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; años.&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Presione cualquier tecla para terminar el programa&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     Console.<span style="color: #0000FF;">ReadKey</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Por supuesto el código se puede hacer más eficiente y mucho más corto, pero quería mostrarte el uso de las funciones mencionadas antes. El código está bastante bien comentado, y espero que con las cosas que expliqué antes se entienda sin problemas. También <strong><a href="http://www.puntopeek.com/wp-content/uploads/2011/06/Calcula-Edad.zip">les dejo el proyecto</a> </strong>para que lo descarguen. Cualquier duda o aporte, en los comentarios.</p>



<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/programacion/creando-una-aplicacion-de-consola-c-sharp/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Como escoger una tipografía</title>
		<link>http://www.puntopeek.com/tipografias/como-escoger-una-tipografia/</link>
		<comments>http://www.puntopeek.com/tipografias/como-escoger-una-tipografia/#comments</comments>
		<pubDate>Thu, 12 May 2011 05:55:36 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Tipografías]]></category>
		<category><![CDATA[webfonts]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=449</guid>
		<description><![CDATA[Aquí se exponen cinco principios básicos para la selección y uso de tipos de letra, en un artículo de Dan Mayer que leí hace un tiempo en Smashing Magazine, un excelente blog sobre desarrollo web que siempre sigo.


No hay entradas relacionadas.]]></description>
			<content:encoded><![CDATA[
<p>Para muchos principiantes (me incluyo) la tarea de escoger las fuentes para un proyecto se hace un poco complicada, y casi siempre terminamos usando Verdana o Arial, y en el mejor de los casos Trebuchet, porque hemos leido en algún lado que es bastante legible. Pues la verdad, es que es bastante complicado seleccionar el tipo de letra correcta, por no decir mezclarlas, incluso para los diseñadores.</p>
<p>Bueno, aquí les dejo un artículo de <a href="http://portfolio.danmayer.com/">Dan Mayer</a> que leí hace un tiempo en <a href="http://www.smashingmagazine.com">Smashing Magazine</a>, en el cual expone cinco principios para la selección y uso de tipos de letra:</p>
<h3><a href="http://www.smashingmagazine.com/2010/12/14/what-font-should-i-use-five-principles-for-choosing-and-using-typefaces/">“What Font Should I Use?”: Five Principles for Choosing and Using Typefaces</a></h3>
<h2>Otros artículos que te pueden interesar:</h2>
<ul>
<li><a href="http://www.smashingmagazine.com/2011/03/24/how-to-choose-a-typeface/">How to Choose a Typeface</a></li>
<li><a href="http://www.smashingmagazine.com/2010/11/04/best-practices-of-combining-typefaces/">Best Practices of Combining Typefaces</a></li>
<li><a href="http://www.smashingmagazine.com/2011/03/02/the-font-face-rule-revisited-and-useful-tricks/">The @Font-Face Rule And Useful Web Font Tricks</a></li>
<li><a href="http://opentype.info/blog/2011/04/25/the-onion-layer-model-of-legibility/">The Onion Layer Model of Legibility</a></li>
</ul>



<p>No hay entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/tipografias/como-escoger-una-tipografia/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ordenación por mezcla en C#</title>
		<link>http://www.puntopeek.com/codigos-c/el-metodo-de-ordenacion-merge-sort/</link>
		<comments>http://www.puntopeek.com/codigos-c/el-metodo-de-ordenacion-merge-sort/#comments</comments>
		<pubDate>Sat, 02 Apr 2011 06:38:10 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[Codigos C#]]></category>
		<category><![CDATA[algoritmos]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[ordenación]]></category>
		<category><![CDATA[recursividad]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=429</guid>
		<description><![CDATA[Ya he publicado algunos algoritmos de ordenación como Ordenación por burbuja (Bubble Sort) y Ordenación Rápida (Quick Sort). Esta vez estaremos hablando de otro algoritmo recursivo bastante eficiente para ordenar elementos.


Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/' rel='bookmark' title='Permanent Link: El método de ordenación QuickSort'>El método de ordenación QuickSort</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>Ya he publicado algunos algoritmos de ordenación como <em>Ordenación por burbuja</em> (Bubble Sort) y <em>Ordenación Rápida </em>(Quick Sort) implementados con C#. Esta vez estaremos hablando de <em>Ordenación por Mezcla</em> (Merge Sort), otro algoritmo recursivo bastante eficiente para ordenar un array, que tiene un <a href="http://www.lab.dit.upm.es/~lprg/material/apuntes/o/index.html" target="_blank">orden de complejidad</a> O(nlogn) al igual que Quick Sort. Fue desarrollado en 1945 por <a title="John Von Neumann" href="http://es.wikipedia.org/wiki/John_Von_Neumann">John Von Neumann</a> según wikipedia.</p>
<h2>Estrategia de Merge Sort</h2>
<p>Merge Sort está basado en la técnica de diseño de algoritmos <a href="../codigos-c/recursividad-con-c-2/">Divide y Vencerás</a>, de la cual se habló aquí mismo hace un tiempo. Recordando un poco, esta técina  consiste en dividir el problema a resolver en subproblemas del mismo tipo que a su vez se dividirán, mientras no sean suficientemente   pequeños o triviales.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2011/04/merge.png"><img class="alignnone size-full wp-image-430" title="merge" src="http://www.puntopeek.com/wp-content/uploads/2011/04/merge.png" alt="merge Ordenación por mezcla en C#" width="616" height="372" /></a></p>
<p>Veamos una panorámica de la <strong>estrategia que sigue</strong> este algoritmo para ordenar una secuencia S de n elementos:</p>
<ul>
<li>Si S tiene uno o ningún elemento, está ordenada</li>
<li>Si S tiene al menos dos elementos se divide en dos secuencias S1 y S2</li>
<li>S1 contiene los primeros n/2 elementos y S2 los restantes</li>
<li>Ordenar S1 y S2, aplicando recursivamente este procedimiento</li>
<li>Mezclar S1 y S2 en S, de forma que ya S1 y S2 estén ordenados</li>
</ul>
<p>Veamos ahora como sería la <strong>estrategia para mezclar</strong> las secuencias:</p>
<p>Se tienen referencias al principio de cada una de las secuencias a mezclar (S1 y S2). Mientras en alguna secuencia queden elementos, se inserta en la secuencia resultante (S) el menor de los elementos referenciados y se avanza esa referencia una posición.</p>
<h2>Pseudocódigo</h2>
<p>Como ven, la idea es bastante simple, pero programarla no tanto. Para no dar de golpe la solución, veamos primero un pseudocódigo del algoritmo:</p>
<pre><strong>function</strong> mergesort(<strong>array</strong> A[x..y])
<strong>begin</strong>
  <strong>if</strong> (x-y &gt; 1)):
    <strong>array</strong> A1 := mergesort(A[x..(<strong>int</strong>( x+y / 2))])
    <strong>array</strong> A2 := mergesort(A[<strong>int</strong>(1+(x+y / 2))..y])
    <strong>return</strong> merge(A1, A2)
  <strong>else:</strong>
    <strong>return</strong> A
<strong>end</strong>

<strong>function</strong> merge(<strong>array</strong> A1[0..n1], <strong>array</strong> A2[0..n2])
<strong>begin</strong>
  <strong>integer</strong> p1 := 0
  <strong>integer</strong> p2 := 0
  <strong>array</strong> R[0..(n1 + n2 + 2)]//suponiendo que n1 y n2 son las posiciones
  //del array y no el length de este mismo, de otro modo seria (n1 + n2)
  <strong>while</strong> (p1 &lt;= n1 <strong>or</strong> p2 &lt;= n2):
    <strong>if</strong> (p1 &lt;= n1 <strong>and</strong> A1[p1] &lt;= A2[p2]):
      R[p1 + p2] := A1[p1]
      p1 := p1 + 1

    <strong>else</strong>
      <strong>if</strong> (p2 &lt;= n2 <strong>and</strong> A1[p1] &gt; A2[p2]):
        R[p1 + p2] := A2[p2]
        p2 := p2 + 1
  <strong>return</strong> R
<strong>end
</strong></pre>
<h2>El código</h2>
<p>Básicamente, el pseudocódigo sigue la estrategia descrita anteriormente. Veamos el código en C# de una vez:</p>
<pre>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MergeSort
{
 class Program
 {
    static void Main(string[] args)
    {
       //Array desordenado inicial
       int[] nums = new int[] { 2, 7, 4, 7, 2, 9, 13, 4, 6, 8 };
       MergeSort(nums);

       //Imprimo el array ya ordenado
       for (int i = 0; i &lt; nums.Length; i++)
          Console.Write(nums[i]+" ");
       Console.ReadLine();
    }

    //Método portal que llama al método recursivo inicial
    public static void MergeSort(int[] x)
    {
       MergeSort(x, 0, x.Length - 1);
    }

    static private void MergeSort(int[] x, int desde, int hasta)
    {
       //Condicion de parada
       if (desde == hasta)
          return;

       //Calculo la mitad del array
       int mitad = (desde + hasta) / 2;

       //Voy a ordenar recursivamente la primera mitad
       //y luego la segunda
       MergeSort(x, desde, mitad);
       MergeSort(x, mitad + 1, hasta);

       //Mezclo las dos mitades ordenadas
       int[] aux = Merge(x, desde, mitad, mitad + 1, hasta);
       Array.Copy(aux, 0, x, desde, aux.Length);
    }

    //Método que mezcla las dos mitades ordenadas
    static private int[] Merge(int[] x, int desde1, int hasta1, int desde2, int hasta2)
    {
       int a = desde1;
       int b = desde2;
       int[] result = new int[hasta1 - desde1 + hasta2 - desde2 + 2];

       for (int i = 0; i &lt; result.Length; i++)
       {
          if (b != x.Length)
          {
             if (a &gt; hasta1 &amp;&amp; b &lt;= hasta2)
             {
                result[i] = x[b];
                b++;
             }
             if (b &gt; hasta2 &amp;&amp; a &lt;= hasta1)
             {
                result[i] = x[a];
                a++;
             }
             if (a &lt;= hasta1 &amp;&amp; b &lt;= hasta2)
             {
                if (x[b] &lt;= x[a])
                {
                   result[i] = x[b];
                   b++;
                }
                else
                {
                   result[i] = x[a];
                   a++;
                }
             }
          }
          else
          {
             if (a &lt;= hasta1)
             {
                result[i] = x[a];
                a++;
             }
          }
       }
       return result;
    }
  }
}</pre>
<p>Este código lo hice cuando estaba en 1er año, y ahora que lo veo (que ya estoy en 3ro), veo se que se pueden hacer unas cuantas mejoras, pero funciona perfectamente y está bastante comprensible, sobre todo para quien no está familiarizado con el algoritmo y la recursividad.</p>
<p>De todas formas dejo el zip para que puedan <a href="http://www.puntopeek.com/wp-content/uploads/2011/04/MergeSort.zip">descargar el proyecto completo</a>, lo único es que está en Visual Studio 2010. Si tienen alguna duda o aporte, en los comentarios.</p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/codigos-c/metodo-ordenacion-quicksort-cshar/' rel='bookmark' title='Permanent Link: El método de ordenación QuickSort'>El método de ordenación QuickSort</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/codigos-c/el-metodo-de-ordenacion-merge-sort/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Graphite, Template gratis de wordpress</title>
		<link>http://www.puntopeek.com/wordpress/graphite-template-gratis-de-wordpress/</link>
		<comments>http://www.puntopeek.com/wordpress/graphite-template-gratis-de-wordpress/#comments</comments>
		<pubDate>Wed, 16 Mar 2011 17:43:09 +0000</pubDate>
		<dc:creator>Tomy</dc:creator>
				<category><![CDATA[wordpress]]></category>
		<category><![CDATA[themes wordpress]]></category>

		<guid isPermaLink="false">http://www.puntopeek.com/?p=419</guid>
		<description><![CDATA[Hoy les presento Graphite, un tema desarrollado por MediaLoot, con una gran calidad, muy bien diseñado, con administración personalizada y muy bien estructurado, de hecho cuenta con toda la calidad para ser de pago.


Entradas relacionadas<li><a href='http://www.puntopeek.com/wordpress/crear-themes-para-wordpress/' rel='bookmark' title='Permanent Link: Crear themes para wordpress'>Crear themes para wordpress</a></li>
]]></description>
			<content:encoded><![CDATA[
<p>Todos los que de una forma u otra nos dedicamos al diseño web, blogging, etc, en algún momento hemos oido por lo menos mencionar a Wordpress. Lamentablemente en la <a title="Sitio oficial de wordpress" href="http://wordpress.org/extend/themes/" target="_blank">página oficial de temas</a> de wordpress no hay suficientes temas de calidad o se hace muy difícil encontrarlos.</p>
<p>Hoy les presento Graphite, un tema desarrollado por MediaLoot, con una gran calidad, muy bien diseñado y estructurado, de hecho cuenta con toda la calidad para ser de pago.</p>
<p><a href="http://www.puntopeek.com/wp-content/uploads/2011/03/Blog_Screenshot.jpg"><img class="alignnone size-full wp-image-420" title="Blog_Screenshot" src="http://www.puntopeek.com/wp-content/uploads/2011/03/Blog_Screenshot.jpg" alt="Blog Screenshot Graphite, Template gratis de wordpress" width="610" height="510" /></a></p>
<p><a href="http://www.medialoot.com/graphite/" target="_blank">Vista previa</a> | <a href="http://medialoot.com/main/freebie/292/" target="_blank">Download</a> | <a href="http://medialoot.com/item/graphite-wordpress-template/">Sitio del autor</a></p>
<p>El tema Graphite es completamente funcional, <strong>gratis</strong> y perfecto para profesionales del desarr0llo y diseño web, se adapata especialmente para sitios de empresas o portafolios.</p>
<p><strong>Principales características:</strong></p>
<ul>
<li>Desarrollado desde 0 usando HTML5 y CSS3</li>
<li>Tipo de contenido para Portfolio</li>
<li>Administracion del tema personalizado</li>
<li>2 alternativas para jquery slider en el home</li>
<li>Administracion de las imágenes mostradas en el slider</li>
</ul>
<p>En caso de que quieras buscar más temas para <strong>wordpress</strong>, o este no sea el más conveniente para tu proyecto, puedes hechar un vistazo en <a href="http://www.smashingmagazine.com/2010/08/19/100-free-high-quality-wordpress-themes-for-2010/" target="_blank">Smashing Magazine</a></p>



<p>Entradas relacionadas<li><a href='http://www.puntopeek.com/wordpress/crear-themes-para-wordpress/' rel='bookmark' title='Permanent Link: Crear themes para wordpress'>Crear themes para wordpress</a></li>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.puntopeek.com/wordpress/graphite-template-gratis-de-wordpress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 1.740 seconds -->

