¿Querés chatear en mi blog? Fijate abajo, en la columna derecha podés usar GTalk
(Si no te funciona con IE probá con Firefox)

lunes, 14 de enero de 2008

LINQ y otras yerbas de C# 3.0

En este post expongo con un ejemplo simple, la impresión de números pares del 1 al 20, algunas características nuevas de C# 3.0 como LINQ, Lamba expressions, Extensions methods, comparadas con algunas características que ya estaban incluidas en C# 2.0 como Anonymous Method en contraste con nuestro viejo y querido foreach. Es un ejemplo muy simplista, pero sirve para ilustrar las nuevas características incorporadas en la nueva versión de C#.

Código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQ_Lab_1
{
    class Program
    {
        static int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };

        static void Main(string[] args)
        {
            PrintHeadLine("For each sample - C# 1.0");
            PrintEvenNumbersForEach();

            PrintHeadLine("Anonymus Method - C# 2.0");
            PrintEvenNumbersAnonymusMethod();

            PrintHeadLine("Anonymus Method 2 - C# 2.0");
            PrintEvenNumbersAnonymousMethod2();

            PrintHeadLine("LINQ - C# 3.0");
            PrintEvenNumbersLinq();

            PrintHeadLine("Lambda Expressions - C# 3.0");
            PrintEvenNumbersLamba();

            PrintHeadLine("Extension Methods - C# 3.0");
            PrintEvenNumbersExtensionMethods();

            PrintHeadLine("Anonymous Type - C# 3.0");
            PrintEvenNumbersAnonymousType();

            Console.ReadLine();
        }

        static void PrintSeparator()
        {
            Console.WriteLine("---------------------------");
        }

        static void PrintHeadLine(string text)
        {
            PrintSeparator();
            Console.WriteLine(text);
            PrintSeparator();
        }

        /// <summary>
        /// Utilizando la clasica version con Foreach
        /// C# 1.0
        /// </summary>
        static void PrintEvenNumbersForEach()
        {
            /* Viejo y querido foreach
             * */
            foreach (int n in numbers)
                if (n % 2 == 0)
                    Console.WriteLine(n.ToString());
        }

        /// <summary>
        /// Utilizando delegados y metodos anonimos
        /// C# 2.0
        /// </summary>
        static void PrintEvenNumbersAnonymusMethod()
        {
            /* Aqui se esta utilizando un delegado que representa un metodo anonimo
             * con el codigo: "return n % 2 == 0"
             * */
            int[] evens = Array.FindAll(numbers, delegate(int n) { return n % 2 == 0; });
            foreach (int n in evens)
                Console.WriteLine(n.ToString());
        }

        /// <summary>
        /// Utilizando Anonymous Method 2
        /// C# 2.0
        /// </summary>
        static void PrintEvenNumbersAnonymousMethod2()
        {
            /* La version mas compacta: 1 sola linea

             * */
            Array.ForEach(numbers, delegate(int n) { if (n % 2 == 0) Console.WriteLine(n.ToString()); });
        }

        /// <summary>
        /// Utilizando LINQ
        /// C# 3.0
        /// </summary>
        static void PrintEvenNumbersLinq()
        {
            //Expresion LINQ al mejor estilo SQL
            var evens = from n in numbers
                        where n % 2 == 0
                        select n.ToString();

            foreach (string n in evens)
                Console.WriteLine(n);
        }

        /// <summary>
        /// Utilizando Lambda Expressions
        /// C# 3.0
        /// </summary>
        static void PrintEvenNumbersLamba()
        {
            /* Aqui se esta utilizando un expresion lambda
             * que se puede interpretar como "para todo n que cumpla con la regla n % 2 == 0"
             * podemos ver el codigo representa una expresion más natural:
             * "Buscar todos los n en numbers que cumplan con la condicion n % 2 == 0"
             * */

            var evens = Array.FindAll(numbers, n => n % 2 == 0);
            foreach (int n in evens)
                Console.WriteLine(n.ToString());

        }

        /// <summary>
        /// Utilizando Extension Methods
        /// C# 3.0
        /// </summary>
        static void PrintEvenNumbersExtensionMethods()
        {
            /* Aqui utilizamos Extension Methods y una expresion lambda para
             * el predicado
             * */

            var evens = numbers.Where(n => n % 2 == 0);
            foreach (int n in evens)
                Console.WriteLine(n.ToString());
        }

        /// <summary>
        /// Utilizando LINQ y Anonymous Types
        /// C# 3.0
        /// </summary>
        static void PrintEvenNumbersAnonymousType()
        {
            /* En la clausula "select" de la expresion LINQ creamos un tipo anonimo
             * conformado por el miebro "n" con el valor del entero y otro miembro
             * "name" que representa a n.ToString().
             * Luego utilizamos "n.name"
             * */
            var evens = from n in numbers
                        where n % 2 == 0
                        select new { n, name = n.ToString() };

            foreach (var n in evens)
                Console.WriteLine(n.name);
        }

    }
}

Resultado:

image

Performance:

Aquí podemos observar que en cuestiones de performance el método más veloz es el foreach, mientras que el que peor rendimiento posee es del de creación de un tipo anónimo.

image

 

GB.

viernes, 11 de enero de 2008

FILESTREAM uno de los nuevos tipos de datos en SQL Server 2008

Hace poco tiempo estuve involucrado en algunas iniciativas para sistemas de gestión de documentos (una solución que incluía MOSS 2007 + BizTalk Server 2006 + SQL Server 2005) y me di dejó rondando en la cabeza el poco soporte para bases de datos documentales que tenía SQL Server hasta ese entonces, dado que la única solución para almacenar documentos es el clásico tipo de datos binario (BLOB). Esto no es conveniente ya que es un tipo de datos muy genérico para almacenar objetos binarios y no tiene ningún soporte específico para gestionar tal columna como un documento.

Ahora SQL Server 2008 incorpora un nuevo tipo de datos denominado FILESTREAM (en realidad es un atributo que se coloca a un tipo de datos varbinary) y que permite que el contenido de esta columna se almacene directamente en el File System (utilizando NTFS) lo que mejora notablemente la performance y llevando cualquier restricción de tamaño a los límites del File System. Esta columna se comparta como cualquier BLOB, solo cambia el almacenamiento físico utilizado.

Esta característica sumada  a la posibilidad de crear columnas BLOB remotas (que pueden almacenarse en dispositivos específicos para este fin) mejorará las capacidades intrínsecas de SQL Server para dar soporte a mejores soluciones documentales.

Tabla comparativa de las opciones para manejar BLOBs

image

 

GB.

jueves, 3 de enero de 2008

Chau a Netscape

El viejo navegador web Netscape a dado sus últimos pasos con su versión número 9, luego de la cual no habrá más versiones ni actualizaciones de seguridad. El navegador que en un momento poseía el 80% del mercado, hoy no llega a recolectar ni el 1% de adeptos, por lo que no habrá muchos que lo extrañen, salvo por fines históricos, claro. A pesar de todo supongo que a sus creadores mal no les fue, dado que habían vendido, en la época de la burbuja de Internet, la empresa por 4.200 millones de dólares.

Fuente: http://www.libertaddigital.com/index.php?action=desanoti&cpn=1276320465

GB.