Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método List<T>.BinarySearch (T)

 

Publicado: octubre de 2016

Busca la List<T> completa ordenada para un elemento usando el comparador predeterminado y devuelve el índice de base cero del elemento.

Espacio de nombres:   System.Collections.Generic
Ensamblado:  mscorlib (en mscorlib.dll)

public int BinarySearch(
	T item
)

Parámetros

item
Type: T

Objeto que se va a buscar. El valor puede ser null para los tipos de referencia.

Valor devuelto

Type: System.Int32

Índice de base cero de item en la List<T> ordenada, si es que se encuentra item; en caso contrario, número negativo que es el complemento bit a bit del índice del siguiente elemento mayor que item o, si no hay ningún elemento mayor, el complemento bit a bit de Count.

Exception Condition
InvalidOperationException

El comparador predeterminado Comparer<T>.Default no puede encontrar una implementación de la interfaz genérica IComparable<T> o la interfaz IComparable del tipo T.

Este método utiliza el comparador predeterminado Comparer<T>.Default para el tipo T para determinar el orden de los elementos de lista. El Comparer<T>.Default comprueba la propiedad tipo de si T implementa el IComparable<T> interfaz genérica y utiliza esa implementación, si está disponible. Si no es así, Comparer<T>.Default Si tipo de comprobaciones T implementa el IComparable interfaz. Si tipo T no implementa ninguna de estas interfaces, Comparer<T>.Default produce una InvalidOperationException.

El List<T> ya deben estar ordenados según la implementación del comparador; de lo contrario, el resultado es incorrecto.

Comparar null con cualquier referencia de tipo está permitido y no genera una excepción cuando se usa el IComparable<T> interfaz genérica. Al ordenar, null se considera menor que cualquier otro objeto.

Si el List<T> contiene más de un elemento con el mismo valor, el método devuelve solo una de las apariciones y puede devolver cualquiera de ellas, pero no necesariamente la primera.

Si el List<T> no contiene el valor especificado, el método devuelve un entero negativo. Puede aplicar la operación de complemento bit a bit (~) a este entero negativo para obtener el índice del primer elemento mayor que el valor de búsqueda. Cuando se inserta el valor en el List<T>, se debe utilizar este índice como punto de inserción para mantener el criterio de ordenación.

Este método es una operación O(log n), donde n es el número de elementos del intervalo.

En el ejemplo siguiente se muestra el Sort() sobrecarga del método y el BinarySearch(T) sobrecarga del método. Un List<T> de cadenas se crea y se rellena con cuatro cadenas, sin ningún orden determinado. La lista se muestran, ordenada y vuelve a mostrar.

El BinarySearch(T) a continuación, se utiliza la sobrecarga del método para buscar dos cadenas que no están en la lista, y el Insert método se usa para insertarlos. El valor devuelto de la BinarySearch(T) método es negativo en cada caso, porque las cadenas no están en la lista. Tomar el complemento bit a bit (el ~ (operador) en C# y Visual C++, Xor -1 en Visual Basic) de este número negativo se produce el índice del primer elemento de la lista que es mayor que la cadena de búsqueda e inserción en esta posición conserva el criterio de ordenación. La segunda cadena buscada es mayor que cualquier elemento de la lista, por lo que es la posición de inserción al final de la lista.

using System;
using System.Collections.Generic;

public class Example
{
    public static void Main()
    {
        List<string> dinosaurs = new List<string>();

        dinosaurs.Add("Pachycephalosaurus");
        dinosaurs.Add("Amargasaurus");
        dinosaurs.Add("Mamenchisaurus");
        dinosaurs.Add("Deinonychus");

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nSort");
        dinosaurs.Sort();

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nBinarySearch and Insert \"Coelophysis\":");
        int index = dinosaurs.BinarySearch("Coelophysis");
        if (index < 0)
        {
            dinosaurs.Insert(~index, "Coelophysis");
        }

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        Console.WriteLine("\nBinarySearch and Insert \"Tyrannosaurus\":");
        index = dinosaurs.BinarySearch("Tyrannosaurus");
        if (index < 0)
        {
            dinosaurs.Insert(~index, "Tyrannosaurus");
        }

        Console.WriteLine();
        foreach(string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }
    }
}

/* This code example produces the following output:

Pachycephalosaurus
Amargasaurus
Mamenchisaurus
Deinonychus

Sort

Amargasaurus
Deinonychus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Coelophysis":

Amargasaurus
Coelophysis
Deinonychus
Mamenchisaurus
Pachycephalosaurus

BinarySearch and Insert "Tyrannosaurus":

Amargasaurus
Coelophysis
Deinonychus
Mamenchisaurus
Pachycephalosaurus
Tyrannosaurus
 */

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 2.0
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: