Sitio donde se podra encontrar información importante y de ayuda en temas de informática y tecnología, con énfasis en programación en .NET
miércoles, 3 de abril de 2013
¿Cómo se puede formatear cadenas de texto?
Cuando tenemos un texto y hacemos lo siguiente:
Console.WriteLine("La cantidad de dinero que tengo en el banco es : {0:C}",dinero);
Ese :C de más quiere decir que formatearemos la entrada como una moneda, por ejemplo en el caso del peso Colombiano, yen japonés, el euro alemán o el peso mexicano. La C determina el tipo de formato, y la cultura, la forma de llevarlo a cabo.
Otros ejemplos son: D para decimal, E para notación exponencial o científica, F para punto decimal fijo (i.e. 4 => 4.0), G para la versión general, es decir, la más compacta posible; N para un número con separador de miles, decimales, etc.; P para porcentaje, R para redondear, X para hexadecimal.
s = string.Format("{0:D}", 99901); // s == 99901
s = string.Format("{0:D10}", 99901); // s == 0000099901
s = string.Format("{0:E}", 1983.42"); // s == 1.98342E+003
s = string.Format("{0:F2}", 1983"); // s == 1983.00
s = string.Format("{0:F3}", 1983.4266"); // s == 1983.427
s = string.Format(japones, "{0:N}", 1983.55); // s == 1.983,55
s = string.Format("{0:P}", 0.42); // s == 42 %
s = string.Format("{0:X4}", 255); // s == 00FF
Si ninguna de estas nos satisface, podemos crear nuestro propio formato mediante el formato de números especializado. Para hacer esto, podemos colocar en lugar del D, E, C, etc., un 0 para representar un dígito, si existe, o un cero si no; un # para representar un dígito si existe, si no, no muestra nada; El punto . para separar decimales y la coma para separar grupos. Asimismo, tenemos % para porcentaje, ‰ para por-miles, E0 para notación exponencial, ‘cadena’ para poner una cadena de texto fija.
s = string.Format("{0:0,00.00#:D}", 99.1); // s == 0,99.10
s = string.Format(aleman, "{0:0,00.00#:D}", 99.1); // s == 0.99,10
s = string.Format("{0:000,000.000}", 9991); // s == 009,991.000
s = string.Format("{0:#,#00}", 99.1); // s == 99
s = string.Format("{0:#,#00}", 9.1); // s == 09
s = string.Format("{0:#,#00}", 9999.1); // s == 9,999
s = string.Format("{0:##-###-##}", 99942); // s == 999-42
s = string.Format("{0:##-###-##}", 4299942); // s == 42-999-42
El formato también podemos aplicarlo a las fechas, de forma muy similar a como se aplica para números. Existen muchos formatos, pero los más utilizados son los siguientes: se usa la d y D para una fecha corta y una fecha larga, respectivamente; f y F para fecha con tiempo corto y largo, u y U para formato universal corto y largo.
CultureInfo enUS = new CultureInfo("en-US");
CultureInfo deDE = new CultureInfo("de-DE");
CultureInfo esMX = new CultureInfo("es-MX");
DateTime tm = new DateTime(2012, 12, 04, 11, 05, 42);
s = string.Format(esMX, "{0:d}", tm); // s == 12/04/2012
s = string.Format(esMX, "{0:d}", tm); // s == 04/12/2012
s = string.Format(deDE, "{0:D}", tm); // s == Dienstag, 4. Dezember 2012
s = string.Format(enUS, "{0:f}", tm); // s == Tuesday, 4 Dic, 2012 11:05
Etcétera. También podemos utilizar formato especial usando y, M, d, m, h, M, s para representar año, mes, día, minuto hora, segundo, etc. Por ejemplo, cuatro yes suponen año en formato de cuatro dígitos, como 1983. Dos yes y tendríamos 83.
s = string.Format(esMX, "{0:ddd d MMM}", tm);
// s == mar 4 dic
s = string.Format(esMX, "{0:dddd d MMMM}", tm);
// s == martes 4 diciembre
s = string.Format(esMX, "{0:H mm ss}", tm);
// s == 11 05 42
s = string.Format(esMX, "{0:y yy yyyy yyyyy}", tm);
// s == 2 12 2012 02012
lunes, 1 de abril de 2013
Calico Electronico
Esta es una animación que me a entretenido demasiado, es graciosa y sirve como relajación de tanto trabajo y estudio.
Cálico Electrónico 1ª Temporada Capítulo 1: Culones
Cálico Electrónico 2ª Temporada Capítulo 1: El fin de Cálico
jueves, 21 de marzo de 2013
Conceptos de C#
Enumerables
IEnumerable: Que premitira enumerar sus propiedades.
IEnumerator: El que retornara las propiedades
por ejemplo: IList, Dictionary
BITARRAY
Esta clase, ubicada en el espacio de nombres System.Collections.
- Implementa ICollection.
- No permite agregar elementos luego de creado.
- El tamaño se define en el constructor.
Ejemplos:
BitArray bits1 = new BitArray(10);BitArray bits2 = new BitArray(bits1);boo[] boolArray = new bool[] { true, true, false, true, false, false, false };BitArray bits3 = new BitArray(boolArray);BitArray bits4 = new BitArray(10, true);byte[] byteArray = new byte[] { 0xff, 0x00 };BitArray bits5 = new BitArray(byteArray);
La primera llamada nos genera un array con diez bits. La segunda llamada nos genera un array el cual copia el tamaño y los bits contenidos en el primer array. El tercer arreglo se crea con siete bits de la forma 1101000, y la siguiente llamada nos genera un arreglo de diez bits, todos inicializados a 1. Finalmente, la quinta llamada nos genera un array de 16 bits, con los primeros ocho bits establecidos a 1 y los siguientes ocho establecidos a 0.
COLECCIONES PARA TRABAJAR CON TEXTO
en este apunte vamos a explorar algunas de las clases que podemos utilizar, en particular, para trabajar con cadenas de texto: StringCollection, StringDictionary y NameValueCollection.
Todas están dentro del espacio de nombres System.Collections.Specialized.
StringCollection: ésta representa una colección de cadenas de texto:
- Está particularmente optimizada para trabajar con cadenas de texto.
- La colección cuenta con varias propiedades estándares, como SyncRoot e IsSynchronized para temas de concurrencia y sincronización en el acceso a elementos;
- Count: Obtiene el número de la colección.
- IsReadOnly: Saber si se puede agregar elementos a la colección.
- Indexador para obtener una cadena de acuerdo al indicado.
- Métodos Add, Remove, Insert.
- AddRange para agregar un array de cadenas de una vez.
StringDictionary: implementa un Hashtable pero fuertemente tipado para emplear cadenas de texto.
NameValueCollection: se comporta como StringDictionary, pero es una colección no un diccionario.
- Nos permite acceder a los elementos via indice y clave.
- Nos permite en el constructor especificar el comparador.
Esto es una resumida explicación del trabajo con estas colecciones.
Fuente
TRES DICCIONARIOS ESPECIALIZADOS
- ListDictionary: mientras Hashtable almacena los pares llave-valor en bloques de memoria que son accesibles vía el código hash de la llave, ListDictionary los almacena como si fuera una lista enlazada. Es decir, el primer elemento contiene el par llave-valor, más un apuntador (o referencia, en el argot de C#) al elemento siguiente, y así sucesivamente hasta llegar al final de la lista. Esto implica que ListDictionary no manipula la memoria (o al menos, no de la forma en que Hashtable lo hace) y por lo tanto el acceso a los elementos es más eficiente en términos de memoria y procesamiento. Esto quiere decir que si la lista es pequeña, el rendimiento es bueno con ListDictionary mientras que si la lista es de un tamaño grande, entonces es mejor trabajar con HashTable.
- HybridDictionary: Supongamos que tenemos un escenario en el cual tenemos un diccionario que generalmente tiene pocos elementos. Pero que bajo ciertas circunstancias, éste puede crecer. Para no perder el rendimiento, tendríamos que usar ListDictionary y cuando éste crezca, copiar todos los elementos a un Hashtable. Pues bien, hay una colección que hace precísamente eso: HybridDictionary. Esta clase emplea de forma interna un ListDictionary cuando el número de elementos se mantiene bajo, pero que cambia a Hashtable cuando el número crece.
OrderedDictionary: Es un diccionario que mantiene ordenados los elementos basados en la llave de los mismos en bloques de memoria contigua, de forma muy similar a como los almacena un array o un vector. La principal ventaja de esto es que podemos acceder a los elementos no solamente a través de la llave, sino también a través de un índice.
Y esos son los tres diccionarios especializados, aunque existen mas, pero luego hablaremos de ellos.
Fuente
list.AddLast("Seiya");
list.AddLast("Shiriu");
list.AddLast("Yoga");
list.AddLast("Shun");
list.AddLast("Ikki");
}
Esta es la ruta donde se encuentran los archivos de los códigos Snippets:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Snippets\1033\Visual C#
Un ejemplo de un archivo, es el siguiente:
Nombre Archivo: query.snippet
Contenido:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2008/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>query</Title>
<Shortcut>query</Shortcut>
<Description>Genera un método encapsulado para consultar datos en la base de datos</Description>
<Author>Sensei - Servinte</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
<SnippetType>SurroundsWith</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<ToolTip>método de consulta de datos</ToolTip>
<Default>object</Default>
</Literal>
</Declarations>
<Code Language="CSharp">
<![CDATA[
/// <summary>
///
/// </summary>
public static $type$ nameMethod()
{
return GetExistMC();
}
/// <summary>
///
/// </summary>
static $type$ GetNameMethod()
{
const string methodName = "GetOrderReportHandler::GetNameMethod()";
bool result = false;
ParameterValues parameters = new ParameterValues();
try
{
BaseRuntime.Trace("chhhcecli", methodName, "Inicia: descripcion de lo que hace el método");
string query = ResourceHelper.GetQuery(Servinte.Clinic.Orders.Reads.Resources.Resources.Queries, BaseRuntime.ProviderName, "ID_QUERY");
parameters.Add(secuence, DbType.Int32);
using (DatabaseManager db = new DatabaseManager(BaseRuntime.ProviderEnum, BaseRuntime.ConnectionString))
using (IDataReader reader = db.ExecuteReader(query,parameters,null))
{
while (reader.Read())
{
if (!reader.IsDBNull(0))
{
}
}
if (reader.IsClosed)
reader.Close();
}
}
catch (Exception ex)
{
BaseRuntime.Log("chhhcecli", methodName, ex);
throw ex;
}
finally
{
BaseRuntime.Trace("chhhcecli", methodName, "Fin: Descripción de lo que hizo el método");
}
return result;
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
COLLECTIONBASE, READONLYCOLLECTIONBASE Y DICTIONARYBASE
CollectionBase: Clase que sirve de base para crear colecciones.
- Implementa estas tres interfaces: IList, ICollection e IEnumerable.
ReadOnlyCollectionBase: La finalidad es que podamos crear colecciones de solo lectura, es decir, que no podamos agregar o eliminar elementos, solo leerlos.
DictionaryBase: También existe una clase análoga a CollectionBase, solo que para diccionarios: DictionaryBase. La clase está estructurada de forma similar a su contraparte. Existen los miembros Count, Clear, CopyTo y GetEnumerator como públicos, así como los métodos para realizar validaciones(OnClear, OnInsert, OnGet, OnSet, OnRemove, OnValidate, etc.) solo que acomodados para poder recibir pares llave-valor. La diferencia más grande (aparte de que esta clase implementa IDictionary en lugar de IList) es que esta clase tiene dos propiedades públicas, Dictionary (de tipo IDictionary) e InnerHashtable (de tipo Hashtable), contrapertes de List e InnerList respectivamente. Ambas representan el diccionario subyacente de DictionaryBase.
COLLECTION GENERIC
Como habrás podido imaginar, el proceso de envolver/desenvolver tipos valor es un proceso que consume recursos, y de hecho hacer esto seguido puede causar daños en rendimiento a tu programa. Comprenderás ahora el problema de utilizar ArrayList (o cualquier colección de las que hemos visto) con tipos de dato valor. Y esto es algo que ni siquiera se soluciona heredando de CollectionBase/DictionaryBase. La única forma real de solventar esta situación sería crear una clase que implemente ICollection/IList/IDictionary y utilizar arrays, los cuales tendríamos que redimensionar manualmente. Y esto no es particularmente productivo.
La llegada de los genéricos en .NET 2.0 solucionó este problema. El poder usar genéricos nos evita los boxings y unboxings para las estructuras, y naturalmente, proporciona métodos y clases fuertemente tipadas. Podríamos reescribir el método foo de hace tres párrafos de la siguiente forma.
A partir de .NET 2.0 se crearon muchas clases de colecciones genéricas, la mayoría bajo el espacio de nombres System.Collections.Generic.
INTERFACES
- IEnumerable<T>
- ICollection<T>
- IList<T>
- IDictionary<K,V>
CLASES
- Queue<T>
- Stack<T>
- SortedList<T>
- SortedDictionary<K,V>: Mantiene el diccionario ordenado por la llave
- LinkedList<T>: Un ejemplo de esta clase:
list.AddLast("Seiya");
list.AddLast("Shiriu");
list.AddLast("Yoga");
list.AddLast("Shun");
list.AddLast("Ikki");
}
- List<T>: Todo sobre esta clase la podemos encontrar en el siguiente link
CLASES
- Clases estaticas
- Para crear una clase no estática que permita crear solo una instancia de sí misma, vea Implementando Singleton en C#
Esta es la ruta donde se encuentran los archivos de los códigos Snippets:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Snippets\1033\Visual C#
Un ejemplo de un archivo, es el siguiente:
Nombre Archivo: query.snippet
Contenido:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2008/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>query</Title>
<Shortcut>query</Shortcut>
<Description>Genera un método encapsulado para consultar datos en la base de datos</Description>
<Author>Sensei - Servinte</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
<SnippetType>SurroundsWith</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<ToolTip>método de consulta de datos</ToolTip>
<Default>object</Default>
</Literal>
</Declarations>
<Code Language="CSharp">
<![CDATA[
/// <summary>
///
/// </summary>
public static $type$ nameMethod()
{
return GetExistMC();
}
/// <summary>
///
/// </summary>
static $type$ GetNameMethod()
{
const string methodName = "GetOrderReportHandler::GetNameMethod()";
bool result = false;
ParameterValues parameters = new ParameterValues();
try
{
BaseRuntime.Trace("chhhcecli", methodName, "Inicia: descripcion de lo que hace el método");
string query = ResourceHelper.GetQuery(Servinte.Clinic.Orders.Reads.Resources.Resources.Queries, BaseRuntime.ProviderName, "ID_QUERY");
parameters.Add(secuence, DbType.Int32);
using (DatabaseManager db = new DatabaseManager(BaseRuntime.ProviderEnum, BaseRuntime.ConnectionString))
using (IDataReader reader = db.ExecuteReader(query,parameters,null))
{
while (reader.Read())
{
if (!reader.IsDBNull(0))
{
}
}
if (reader.IsClosed)
reader.Close();
}
}
catch (Exception ex)
{
BaseRuntime.Log("chhhcecli", methodName, ex);
throw ex;
}
finally
{
BaseRuntime.Trace("chhhcecli", methodName, "Fin: Descripción de lo que hizo el método");
}
return result;
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
lunes, 11 de marzo de 2013
Examen 70-483: Programming in C#
En los siguientes enlaces podemos encontrar dos blog donde nos muestran el temario para el examen y el porcentaje de cada uno de los temas:
- MSDN study links for exam 70-483: Programming in C# (JAYWAY) --> En ingles
- 70-483: programming in C# (Blogoso de Fer++) --> En español.
miércoles, 6 de marzo de 2013
Merge en CSharp
Se me presento un problema al realizar el Merge de dos tablas, pues llegaba un momento en el cual los nuevos datos que queria agregar a la tabla principal, de la tabla nueva, me duplicaba las columnas. Esto me complicaba luego cuando queria trabajar con los datos de la tabla, pues al tener columnas duplicadas ya se imaginaran que sucederia.
La solución fue especificarle los siguientes parámetros:
dtPrincipal.Merge(dtSecundaria,true,MissingSchemaAction.Ignore);
dtPrincipal = DataTable principal donde estamos almacenando la información.
dtSecundaria = DataTable secundaria donde tenemos los datos
La solución fue especificarle los siguientes parámetros:
dtPrincipal.Merge(dtSecundaria,true,MissingSchemaAction.Ignore);
dtPrincipal = DataTable principal donde estamos almacenando la información.
dtSecundaria = DataTable secundaria donde tenemos los datos
Suscribirse a:
Entradas (Atom)





