el Guille, la Web del Visual Basic, C#, .NET y más...

Buscar datos con LINQ sin tener en cuenta mayúsculas/minúsculas

Búsqueda case insensitive usando instrucciones de LINQ.

 

 
Publicado el 16/Ago/2010
Actualizado el 16/Ago/2010
Autor: Guillermo 'guille' Som

Buscar datos con LINQ sin tener en cuenta mayúsculas/minúsculas. O lo que es lo mismo buscar datos case insensitive usando instrucciones de LINQ (ya sea para objetos en memoria como los contenidos en los procedentes de una base de datos).



 

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

 


Código para Visual Basic.NET (VB.NET) 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


 

Código para C Sharp (C#) 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
 


Código de ejemplo (comprimido):

Por ahora no hay código que bajar...




La fecha/hora en el servidor es: 23/12/2024 19:08:54

La fecha actual GMT (UTC) es: 

©Guillermo 'guille' Som, 1996-2024