Mostrando entradas con la etiqueta C#. Mostrar todas las entradas
Mostrando entradas con la etiqueta C#. Mostrar todas las entradas

miércoles, noviembre 03, 2010

Tutorial rápido de C# (C Sharp)
Parte 1: Conceptos básicos

///
/// TUTORIAL RÁPIDO DE C# (C Sharp)
/// (Parte 1)
///
/// * Vía: http://www.csharp-station.com/Tutorial.aspx
///

// **********************************
// * Tipos básicos de datos en C# (C Sharp)

Type  Size (bits) Range
======== =========== ===========================================
sbyte    8           -128 to 127
byte   8    0 to 255
short       16    -32768 to 32767
ushort      16    0 to 65535
int   32    -2147483648 to 2147483647
uint   32    0 to 4294967295
long   64    -9223372036854775808 to 9223372036854775807
ulong       64    0 to 18446744073709551615
char   16    0 to 65535

Type  Size (bits) Precision    Range
======== =========== ==================== ===========================
float       32    7 digits     1.5 x 10-45 to 3.4 x 1038
double      64    15-16 digits    5.0 x 10-324 to 1.7 x 10308
decimal     128   28-29 decimal places    1.0 x 10-28 to 7.9 x 1028

// **********************************
// * Arrays de variables/objetos en C# (C Sharp)

string[] names = {"Cheryl", "Joe", "Matt", "Robert"};


// **********************************
// * Crear un programa básico en C# (C Sharp)

// Namespace Declaration
using System;

// Program start class
class WelcomeCSS
{
   // Main begins program execution.
   static void Main()
   {
      // Write to console
      Console.WriteLine("Welcome to the Tutorial!");
   }
}

//* o leyendo los parámetros que se pasan por consola

using System;

// Program start class
class NamedWelcome
{
   // Main begins program execution.
   static void Main(string[] args)
   {
      // Write to console
      Console.WriteLine("Hello, {0}!", args[0]);
      Console.WriteLine("Welcome to the Tutorial!");
   }
}

// **********************************
// * Escribir/leer en la consola en C# (C Sharp)

Console.WriteLine("Hello console!!");

// Write to console/get input
Console.Write("What is your name?: ");
Console.Write("Hello, {0}! ", Console.ReadLine());
Console.WriteLine("Welcome to the C# Station Tutorial!");

// * ó

string name = Console.ReadLine();

// **********************************
// * Estructura de los métodos

bool createAddress(string name)
{
   Address addr = new Address(name);
   storeAddress(addr);
   return true;
}

// **********************************
// * Crear clases en C# (C Sharp)

using System;

public class Echo
{
   string myString;

   public Echo(string aString)
   {
      myString = aString;
   }

   public void Tell()
   {
      Console.WriteLine(myString);
   }
}

public class Hello
{
   public static void Main()
   {
      Echo h = new Echo("Hello my 1st C# object !");
      h.Tell();
   }
}

// **********************************
// * Estructuras de control en C# (C Sharp)

// if, and else if, and else
// Multiple Case Decision
if (myInt < 0 || myInt == 0)
{
    Console.WriteLine("Your number {0} is less than or equal to zero.", myInt);
}
else if (myInt > 0 && myInt <= 30)
{
    Console.WriteLine("Your number {0} is in the range from 21 to 30.", myInt);
}
else
{
    Console.WriteLine("Your number {0} is greater than 30.", myInt);
}

// switch with integer type
switch (myInt)
{
case 1:
    Console.WriteLine("Your number is {0}.", myInt);
    break;
case 2:
    Console.WriteLine("Your number is {0}.", myInt);
    break;
case 3:
    Console.WriteLine("Your number is {0}.", myInt);
    break;
default:
    Console.WriteLine("Your number {0} is not between 1 and 3.", myInt);
    break;
}

// while loop
while (myInt < 10)
{
    Console.Write("{0} ", myInt);
    myInt++;
}

// do-while loop
do
{
    // Print A Menu
    Console.WriteLine("Something\n");

} while (condition != false);

// for loop
for (int i=0; i < 20; i++)
{
    if (i == 10)
        break;

    if (i % 2 == 0)
        continue;

    Console.Write("{0} ", i);
}

// foreach loop
string[] names = {"Cheryl", "Joe", "Matt", "Robert"};
foreach (string person in names)
{
    Console.WriteLine("{0} ", person);
}

// **********************************
// * Namespaces en C# (C Sharp)

namespace ns1
{
    namespace ns2
    {
        // Program start class
        class NamespaceCSS
        {
            // Main begins program execution.
            public static void Main()
            {
                // Write to console
                Console.WriteLine("This is a Namespace.");
            }
        }
    }
}

viernes, mayo 04, 2007

C# .NET: Uso de HashTable - Using HashTable

Declaración:
//declaración y creación
System.Collections.Hashtable cache;
cache = new System.Collections.Hashtable();

Introducción de nuevos elementos:
//agregamos nuevos elementos
cache.Add(clave,objeto);

Consulta de claves o valores existentes:
//preguntamos si se introdujo algún valor con esa clave
cache.ContainsKey("key");
//preguntamos si se introdujo ese valor
cache.ContainsValue(obj_value);

Recuperación de los elementos introducidos:
//recuperamos un valor previamente introducido
Object obj = cache[key];

Otras funciones con HashTable:
//limpiamos la cache de resultados
cache.Clear();

jueves, marzo 08, 2007

C# .NET: Funciones de matching de cadenas - String matching methods

Aquí incluyo tres filtros de matching, uno que compara el principio de la palabra, otro el final y otro tanto el principio como el final.
Es un buen ejemplo de cómo se interactúa entre string y char[] cuando necesitamos implementar operaciones con cadenas a un nivel más bajo.

//primer filtro de matching mas fuerte (principio y final de la palabra)
public bool match1(string s1, string s2)
{
//haremos el matching de una sola letra si alguna palabra es <2
if (
s1.Length "<" 2 || s2.Length "<" 2)
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0] && p1[s1.Length - 1] == p2[s2.Length - 1])
{
return true;
}
return false;
}
//haremos el matching con dos letras
else
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0] &&amp; p1[1] == p2[1] &&
p1[s1.Length - 1] == p2[s2.Length - 1] && p1[s1.Length - 2] == p2[s2.Length - 2])
{
return true;
}
return false;
}
}

//segundo filtro de matching mas leve (principio de la palabra)
public bool match2(string s1, string s2)
{
//haremos el matching de una sola letra
if (
s1.Length "<" 2 || s2.Length "<" 2)
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0])
{
return true;
}
return false;
}
//haremos el matching con dos letras
else
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0] && p1[1] == p2[1])
{
return true;
}
return false;
}
}

//tercer filtro de matching mas leve (final de la palabra)
public bool match3(string s1, string s2)
{
//haremos el matching de una sola letra

if
(
s1.Length "<" 2 || s2.Length "<" 2)
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
//comprobamos
if (p1[0] == p2[0])
{
return true;
}
return false;
}
//haremos el matching con dos letras
else
{
char[] p1 = s1.ToCharArray();
char[] p2 = s2.ToCharArray();
int l1 = s1.Length;
int l2 = s2.Length;
//comprobamos
if (p1[l1 - 1] == p2[l2 - 1] && p1[l1 - 2] == p2[l2 - 2])
{
return true;
}
return false;
}
}

NOTA: en las partes sombreadas en color gris cambiar los "<" por < (problemas con el html :-( ).

martes, enero 16, 2007

C# .NET : Seleccionar texto dentro de un control WebBrowser - Select text in a WebBrowser control

Lo que encontramos a continuación es un método que nos permite seleccionar texto dentro de un control WebBrowser en C# .NET.

(palabra es el texto que será seleccionado dentro del documento)

//marca la palabra especificada en el texto
public bool marcarPalabra(string palabra) {
bool succes = false;
if (webBrowser1.Document != null)
{
IHTMLDocument2 doc = webBrowser1.Document.DomDocument
as IHTMLDocument2;
IHTMLBodyElement body = doc.body as IHTMLBodyElement;

IHTMLTxtRange range;
range = body.createTextRange();
range.moveStart("character", 1);
int flags = 0;
flags += 2;//(matchWholeWord)
flags += 4;//(matchCase)
success = range.findText(palabra,
true ? 999999 : -999999, flags);
if (success)
{
range.select();
range.scrollIntoView(false);
}
}
return succes;
}

lunes, diciembre 18, 2006

SmartSort v2: ordenar una lista de string en base a una clave en C# .NET - Sorting a string linked list using a word as a key in C# .NET

Segunda versión donde cambia la forma de tener en cuenta la diferencia de longitudes entre las dos palabras que se comparan, evitando así un posible error de índice fuera de rango a la hora de almacenar posteriormente las palabras en el array intermedio.


public System.Collections.Generic.LinkedList smartSort(
System.Collections.Generic.LinkedList lista,
string clave){

char[] auxs;
LinkedList auxl;
int nmatch;
int longi;

//creo un array de linkedlist de tamaño clave*2+1
LinkedList[] clasi = new LinkedList[clave.Length*2 + 1];

//obtengo los caracteres de la clave
char[] clavec = clave.ToCharArray(0,clave.Length);

//para cada una de las palabras de la lista inicial
IEnumerator enu = lista.GetEnumerator();
while (enu.MoveNext()){
nmatch = 0;
auxs = ((string)enu.Current).ToCharArray();

//me quedo con la menor de las longitudes
longi=clave.Length;
if (((string)enu.Current).Length < longi =" ((string)enu.Current).Length;" i =" 0;" i =" longi">= 0; i--){
if (clavec[i] == auxs[i]) nmatch++;
}

//ahora introducimos la diferencia entre longitudes de palabra
nmatch -= Math.Abs(clave.Length -
enu.Current.ToString().Length);
if (nmatch < nmatch =" 0;//controlamos">();
clasi[nmatch].AddLast(enu.Current.ToString());
}

//creo la lista a devolver
auxl = new LinkedList();
for (int i = clave.Length * 2; i >= 0; i--){
if (clasi[i] != null) {
enu = clasi[i].GetEnumerator();
while (enu.MoveNext()){
auxl.AddLast(enu.Current.ToString());
}
}
}

//devuelvo la lista
return auxl;
}

martes, diciembre 12, 2006

Uso del modelo de eventos (Observer) en C#.NET - Using events model in C#.NET

Este es un ejemplo muy simple del uso del modelo de eventos (modelo muy parecido al Observer u Observador o también llamado de suscripción pública) en C#.NET.

El elemento que lanza los eventos (observable) deberá incluir el siguiente código:
//declaramos el evento
public event PalabraErroneaEvent OnPalabraErronea;

//declaramos el tipo de manejador asociado al evento
public delegate void PalabraErroneaEvent(object sender, PalabraErroneaArgs e);

//suscipción de metodos al evento
public void addPalabraErroneaListener(IPalabraErroneaListener l){
OnPalabraErronea += new PalabraErroneaEvent(l.newEvent);
}

//lanzamiento del evento
public void notify(PalabraErroneaArgs args){
OnPalabraErronea(this, args);
}

El elemento que reciba los eventos (listener u observer), debe incluir lo siguiente:

Para registrarse debe implementar una interfaz que incluye un método que será usado por la clase que envíe los eventos para añadir un nuevo listener (en este caso el método es newEvent).
public interface IPalabraErroneaListener{
void newEvent(object sender, PalabraErroneaArgs e);
}

Una vez que se implemente la interfaz, nos registraremos en el lanzador del evento usando el método que nos ofrece para ello.
//nos suscribimos
nombre_del_lanzador.addPalabraErroneaListener(this);

Para recibir y manejar los eventos implementa el método anteriormente descrito.
public void newEvent(object sender, PalabraErroneaArgs e) {
@todo
}

miércoles, noviembre 08, 2006

Leer un fichero de texto en C# .NET reconociendo tildes (acentos) y otros signos especiales - To read a text file in C# .NET and recognize special characters and signs

Esto consiste en un proceso muy sencillo pero se nos puede complicar si somos algo novatos o venimos de Java y estamos acostumbrados a lo fácil.

Para empezar, C# .NET posee un mecanismo de lectura de ficheros de texto muy eficiente, siendo éste el siguiente:
// Método para procesar un fichero
public void procesarFichero()
{
// Definimos un StreamReader
StreamReader lector;
string linea = "";

try{
lector = File.OpenText(fichero);

// Lee linea a linea
while ( (linea = lector.ReadLine()) != null){
//hacemos lo que queramos
}
// Cerramos la conexion
lector.Close();
}
catch (Exception e){
System.Console.WriteLine("Problemas al cargar el fichero.{0}", e);
}
}

El problema viene si al llevar a cabo el proceso de lectura, podemos observar que los string resultado no incorporan caracteres especiales como por ejemplo las tildes y acentos de otro tipo.
La causa de este problema es que el descriptor que hemos utilizado anteriormente sólo reconoce ficheros con codificación UTF-8 (por defecto), por lo que la entrada debe estar codificada de este modo. ¿entonces, cómo podemos convertir nuestro fichero de texto de toda la vida a UTF-8?
Pues muy sencillo: tomamos un editor básico de texto (bloc de notas de windows o similares), abrimos nuestro fichero, seleccionamos la opción de guardar como... y en el campo referente a codificación seleccionaremos UTF-8.

//claves: procesar fichero texto c# .net utf-8 reconocer tildes read text file

lunes, noviembre 06, 2006

SmartSort v1: ordenar una lista de string en base a una clave en C# .NET

Éste método nos ayuda a ordenar una linkedlist de string en c# en base a una clave, ordenando de menor a mayor grado de parecido.
Muy útil para el manejo de cadenas ordenadas.


//funcion para reordenar la lista de la forma mas eficiente
public System.Collections.Generic.LinkedList smartSort(
System.Collections.Generic.LinkedList lista,
string clave){

char[] auxs;
LinkedList auxl;
int nmatch;
int longi;

//creo un array de linkedlist de tamaño clave*2+1
LinkedList[] clasi = new LinkedList[clave.Length*2 + 1];

//obtengo los caracteres de la clave
char[] clavec = clave.ToCharArray(0,clave.Length);

//para cada una de las palabras de la lista inicial
IEnumerator enu = lista.GetEnumerator();
while (enu.MoveNext()){
nmatch = 0;
auxs = ((string)enu.Current).ToCharArray();

//me quedo con la menor de las longitudes
longi=clave.Length;
if (((string)enu.Current).Length < longi =" ((string)enu.Current).Length;" i =" 0;" i =" longi-1;">=0; i--){
if (clavec[i] == auxs[i]) nmatch++;
}

//si nmatch==0 introduzco la diferencia de longitudes como distancia
if (nmatch == clave.Length*2){
nmatch = nmatch - Math.Abs(clave.Length - enu.Current.ToString().Length);
//controlo los limites permitidos
if (nmatch > clave.Length * 2) nmatch = clave.Length * 2;
}

//clasifico esta palabra
if (clasi[nmatch] == null) clasi[nmatch]=new LinkedList();
clasi[nmatch].AddLast(enu.Current.ToString());
}

//creo la lista a devolver
auxl = new LinkedList();
for (int i = clave.Length * 2; i >= 0; i--){
if (clasi[i] != null) {
enu = clasi[i].GetEnumerator();
while (enu.MoveNext()){
auxl.AddLast(enu.Current.ToString());
}
}
}

//devuelvo la lista
return auxl;
}


//claves: ordenar lista palabras clave c# .net order list linkedlist words key

Filtro de palabras para C# - Eliminación de signos de puntuación, tildes, ...

Éste es un método muy útil para tratar cadenas antes de almacenarlas en cualquier tipo de coleción, ya que nos ahorrará muchos problemas a la hora de recuperarlas y trabajar con ellas. Ésta es una versión muy simple pero muy fácil de modificar.

//función para filtrar la palabra y dejarla lista para tratarla
//devuelve la palabra filtrada o null en caso de que no pase el filtro
public string filtro(string palabra){

//eliminamos palabras de un caracter solo
if (palabra.Length == 1) return null;

string aux=palabra;
//eliminamos caracteres que nos puedan estorbar
char[] simbolos = new char[6];
simbolos.SetValue(',',0);
simbolos.SetValue(';',1);
simbolos.SetValue('.',2);
simbolos.SetValue(':',3);
simbolos.SetValue('-',4);
simbolos.SetValue('_',5);
aux=aux.Trim(simbolos);
//pasamos a minusculas
aux=aux.ToLower();

return aux;
}


//claves: filtro palabras c# sharp eliminar caracteres signos puntuacion