Como funciona a Interface IComparable, do .NET ?


Interface IComparable

A Interface IComparable normalmente é confundida com a interface IComparer. Ambos são utilizados para comparações entre objetos. O IComparable, ou comparável, possui um método com a assinatura: int CompareTo(System.Object); . Repare que este método retorna um int. Isto acontece por que outros métodos utilizam as variações de retorno de coleções que implementam IComparable para fazer ordenação. O algoritmo de ordenação utilizado pelo .NET e suas otimizações não serão descritas neste artigo.
A Interface IComparer, ou comparador, é utilizada de para comparar 2 objetos segundo a assinatura:  int Compare(System.Object x, System.Object y);. Diferentemente do CompareTo(System.Object) do IComparable, o Compare(System.Object x, System.Object y) do IComparer compara 2 objetos, e não um objeto com o próprio.
Estas interfaces devem ser utilizadas para tipos por referência que não devam possuir sobrecarga do operador de comparação. Como o .NET não faz isso nativamente, recomenda-se fazer sobrecarga do operador de comparação ‘==’ que faz chamada ao método Compare(System.Object x, System.Object y), numa espécie de facade.
As interfaces IComparable e IComparer trabalham com System.Object e não com tipos genéricos. São heranças do .NET 1.0/1.1. Atualmente existem versões genéricas de ambas as interfaces. O trabalho com System.Object pede boxing e unboxing, interno e externo respectivamente. Se o tipo passado para os métodos das interfaces não estiver coerente com a classe, uma exceção deve ser lançada. Recomenda-se o uso da exceção ArgumentException para este tipo do problema.
O método int CompareTo de IComparable é base para o método Sort() de ArrayList funcionar. Este método deve retornar -1, 0 ou 1 seguindo um determinado critério definido pelo programador. Através de seu algoritmo interno de ordenação o Sort() de ArrayList faz o ordenamento.
Vamos considerar uma classe que implemente ICompare chamada Pessoa. Esta classe possui string nome e int idade. Vamos considerar que apenas o nome seja ordenável. Numa situação destas é interessante o uso do método CompareTo() da string nome como retorno do CompareTo() da classe Pessoa. Esta solução é válida para qualquer tipo primitivo ou mesmo por referencia que implemente ICompare e que seja ordenável em alguma classe.
public int CompareTo(object obj)
{
pessoateste p = (pessoateste)obj;
      return this.nome.CompareTo(p.nome);
}

Como é a informação, vista como bem econômico?

Idade do Byte Lascado

Já ouvi algumas pessoas falando que estamos saindo da Idade do Byte Lascado e entrando na Idade do Byte Polido. Estudando gestão do conhecimento e assistindo a vertiginosa ascensão da tecnologia da informação no mercado, fica muito clara a importância da informação. Não é nem a infraestrutura nem o desenvolvimento o que importa para as empresas: elas têm estes setores porque os armários de arquivos são muito lentos. Mas o que importa é a informação processada por elas.

Estava me lembrando de alguns vídeos muito bacanas de um consultor de carreira chamado Waldez Ludwig, falando sobre esta questão. Deem uma olhada:


Como o SharePoint 2010 se posiciona no mercado, segundo Gartner

O SharePoint 2010 está aparecendo com destaque segundo as avaliações do Gartner. Muito bem avaliado e classificado em dois quadrantes, é uma das principais plataformas colaborativas do mercado.


Social Software in the Workplace
Foi considerado o melhor em habilidade de execução e o segundo mais visionário. Esta avaliação foi feita em cerca de 12 meses passando por critérios como facilidade de adoção, usabilidade e inovação tecnológica.

Veja o artigo oficial sobre Social Software in the Workplace, no Gartner
http://www.gartner.com/technology/media-products/reprints/microsoft/vol14/article5/article5.html 



Horizontal Portals
Nesta área o SharePoint obteve a melhor colocação do mercado. Aparece em primeiro em habilidade de execução e como visionário. Esta análise foi feita por Jim Murphy, Gene Phifer, Ray Valdes, Eric Knipp. Avaliaram caracteristicas RIA (Rich Internet Applications), Web 2.0 entre outras.
Segundo o artigo, o SharePoint é bem considerado em mais de 70% das avaliações do Garnter.

Veja o Artigo oficial sobre Horizontal Portals, no Gartner
http://www.gartner.com/technology/media-products/reprints/microsoft/vol13/article10/article10.html

Como obter o HashCode de uma Coleção (List), em .NET?


Hoje tive um pequeno problema para resolver e acabei percebendo algumas coisas interessantes. Eu precisei comparar se duas List<T> são iguais e percebi que não teria uma solução nativa para mim. Normalmente eu sobrescrevo oGetHashCode e crio meu Hash, mas neste caso é diferente.
Acabei criando uma solução que vale para qualquer List, veja só:
public static int GetHashCode<T>(this List<T> l)
{
int hash = 0;
foreach (T item in l)
{
hash ^= item.GetHashCode();
}
return hash;
}

É importante frizar: O tipo T tem que sobrescrever o GetHashCode, se não for umBuilt-in Type. Por exemplo:
public class Pessoa
{
int idade { get; set; }
string nome { get; set; }

public override int GetHashCode()
{
return idade ^ nome.GetHashCode();
}
}


List<Pessoa> pessoas = obterPessoas(); // Obtem 150 pessoas aleatórias
Int hash = pessoas.GetHashCode<Pessoa>();


Como construir aviões em pleno voo?

Programadores, Designers, DBAs são algumas das profissões que conheço que aprendem a construir aviões em pleno voo. Algumas vezes, apenas, trocam turbinas em voo.
Sei que muito adoram trabalhar com ofícios como este: