Introducción:
Pues eso, otra de las preguntillas de estos días en los foros, pero que
seguro que a mas de uno se le ha pasado por la cabeza y lo mismo lo ha
solucionado por su cuenta o lo mismo ha buscado otra forma, pero... aquí te
pongo un ejemplo (tanto con Visual Basic como Visual C#) que hace eso, es
decir, busca en una colección de datos (o en el resultado obtenido de una base
de datos) para ver si un campo (o propiedad) en concreto coincide con otro, en
este ejemplo si lo contiene, pero sin tener en cuenta si están o no en
mayúsculas o minúsculas, es decir se hace una comprobación "case insensitive"
(sin tenerlo en cuenta).
El código de ejemplo:
Nota:
En este ejemplo se utiliza una colección generic del tipo List(Of Cliente) o
List<Cliente>, más abajo se incluye el código para crear esa colección,
tanto para Visual Basic como para C#.
Debido a que se utilizan instrucciones de LINQ, este código solamente es
válido para versiones de .NET Framework igual o superior a la 3.5.
En el caso de la clase Cliente para Visual Basic sólo es válido para la
versión 2010, salvo que definas las propiedades de forma "habitual".
Para crear la colección, declara una variable del tipo que te he indicado
en la nota y le asignas lo que devuelva el método:
CrearColeccionClientes de la clase Cliente.
Si no sabes cómo hacer esto último... jum... mejor que no sigas leyendo...
(y te pases antes por el final para ver cómo se hace... jejeje).
Como puedes comprobar, el "truco" consiste en convertir en minúsculas (ToLower)
los dos datos a comparar, también podríamos haber usado el método Compare
indicando que no haga distinción de mayúsculas y/o minúsculas, pero así
queda mas evidente qué tipo de comparación se hace.
Para Visual Basic:
' no diferenciar mayúsculas de minúsculas (case insensitive)
Private Sub consultaCaseInsensitive(ByVal txtConsulta As String)
Dim losClientes = From cli In clis _
Where cli.Apellidos.ToLower().Contains(txtConsulta.ToLower().Trim()) _
Order By cli.DNI _
Select cli
For Each cli In losClientes
Console.WriteLine("{0}, {1}", cli.Apellidos, cli.DNI)
Next
End Sub
Para C#:
// no diferenciar mayúsculas de minúsculas (case insensitive)
static void consultaCaseInsensitive(string txtConsulta)
{
var losClientes = from cli in clis
where cli.Apellidos.ToLower().Contains(txtConsulta.ToLower().Trim())
orderby cli.DNI
select cli;
foreach (var cli in losClientes)
{
Console.WriteLine("{0}, {1}", cli.Apellidos, cli.DNI);
}
}
Quiero recordarte que si la variable "clis" en lugar de
ser un objeto en memoria es un DataTable o tipo de datos
similar, esa búsqueda se podría hacer con los datos obtenidos de una
consulta a una base de datos...
Espero que te sea de utilidad.
Nos vemos.
Guillermo
El código para Visual Basic .NET 2010 de la clase Cliente
Class Cliente
Public Property Nombre As String
Public Property Apellidos As String
Public Property DNI As String
Private Shared rnd As New Random
Public Shared Function NuevoCliente(ByVal id As Integer) As Cliente
Dim sAp As String = Mid("aeiuo", rnd.Next(1, 6), 1) & _
Chr(rnd.Next(65, 65 + 26)) & _
Chr(rnd.Next(97, 97 + 26))
Return New Cliente With { _
.Nombre = "Nombre " & id.ToString, _
.Apellidos = sAp & " Apellidos " & id.ToString, _
.DNI = id.ToString("0000000")}
End Function
Public Shared Function CrearColeccionClientes(ByVal cuantos As Integer) As _
System.Collections.Generic.List(Of Cliente)
Dim col As New System.Collections.Generic.List(Of Cliente)
col.Add(New Cliente With {.Apellidos = "Al", .DNI = 1.ToString("0000000")})
col.Add(New Cliente With {.Apellidos = "Alameda", .DNI = 2.ToString("0000000")})
col.Add(New Cliente With {.Apellidos = "Altanero", .DNI = 3.ToString("0000000")})
col.Add(New Cliente With {.Apellidos = "Banana", .DNI = 4.ToString("0000000")})
col.Add(New Cliente With {.Apellidos = "Butanero", .DNI = 5.ToString("0000000")})
col.Add(New Cliente With {.Apellidos = "Ismael", .DNI = 6.ToString("0000000")})
col.Add(New Cliente With {.Apellidos = "Ism\f1á\f0 el", .DNI = 7.ToString("0000000")})
For i As Integer = col.Count + 1 To cuantos
col.Add(Cliente.NuevoCliente(i))
Next
Return col
End Function
End Class
' Para usar el ejemplo añade esto a un módulo de una aplicación de consola
Dim clis As System.Collections.Generic.List(Of Cliente)
Sub Main()
clis = Cliente.CrearColeccionClientes(3)
consultaCaseInsensitive("e")
Console.WriteLine()
Console.WriteLine("Pulsa INTRO...")
Console.ReadLine()
End Sub
El código para Visual C# 2008 o superior de la clase Cliente
class Cliente
{
public string Nombre { get; set; }
public string Apellidos { get; set; }
public string DNI { get; set; }
private static Random rnd = new Random();
public static Cliente NuevoCliente(int id)
{
string sAp = "aeiuo".Substring(rnd.Next(0, 5), 1) +
(char)(rnd.Next(65, 65 + 26)) +
(char)(rnd.Next(97, 97 + 26));
return new Cliente {
Nombre = "Nombre " + id.ToString(),
Apellidos = sAp + " Apellidos " + id.ToString(),
DNI = id.ToString("0000000") };
}
public static System.Collections.Generic.List<Cliente> CrearColeccionClientes(int cuantos)
{
System.Collections.Generic.List<Cliente> col =
new System.Collections.Generic.List<Cliente>();
col.Add(new Cliente { Apellidos = "Al", DNI = 1.ToString("0000000") });
col.Add(new Cliente { Apellidos = "Alameda", DNI = 2.ToString("0000000") });
col.Add(new Cliente { Apellidos = "Altanero", DNI = 3.ToString("0000000") });
col.Add(new Cliente { Apellidos = "Banana", DNI = 4.ToString("0000000") });
col.Add(new Cliente { Apellidos = "Butanero", DNI = 5.ToString("0000000") });
col.Add(new Cliente { Apellidos = "Ismael", DNI = 6.ToString("0000000") });
col.Add(new Cliente { Apellidos = "Ism\f1á\f0 el", DNI = 7.ToString("0000000") });
for (int i = col.Count + 1; i <= cuantos; i++)
{
col.Add(Cliente.NuevoCliente(i));
}
return col;
}
}
// Para usar el ejemplo añade esto a la clase Program de una aplicación de consola
static System.Collections.Generic.List<Cliente> clis;
static void Main(string[] args)
{
clis = Cliente.CrearColeccionClientes(3);
consultaCaseInsensitive("e");
Console.WriteLine();
Console.WriteLine("Pulsa INTRO...");
Console.ReadLine();
}
Espacios de nombres usados en el código de este artículo:
System.Collections.Generic
System.Linq