2012-03-10 12 views
6

Tengo una lista que almacena una cantidad de objetos. Cada objeto tiene una propiedad en forma de una variable.La estructura de datos más rápida para verificar si una propiedad dentro de una lista de objetos coincide con

Me gustaría poder verificar si alguno de los artículos en esta lista contiene una propiedad determinada. Similar al método de ContainsKey del diccionario. Esta estructura de datos tiene una gran cantidad de valores, posiblemente incluso millones, y me gustaría utilizar una estructura de datos que pueda verificar las propiedades lo más rápido posible.

¿El diccionario sería el más rápido para este trabajo, o hay estructuras de datos más rápidas?

EDIT:

Aquí está una manera rápida, pequeño ejemplo de lo que me gustaría lograr:

Dictionary<string, Person> persons = new Dictionary<string, Person>(); //where string contains the Person's name 

bool isPresent = persons.ContainsKey("Matt"); 
+1

¿De dónde vienen estos millones de registros? Un IEnumerable contra la fuente de datos para * query * los datos son los más rápidos. Cargando millones de registros en la memoria no es práctico. Deje que las bases de datos/NOSQL hagan el trabajo pesado a través de LINQ. – tawman

+0

¿Conoce el tipo y la propiedad con anticipación? Es decir. ¿Está probando objetos de "orden" para la propiedad "Región"? ¿O es un objeto desconocido para una propiedad de nombre fijo? ¿O podría usar dinámica? O si el miembro no está arreglado, ¿tal vez FastMember? O...? O...? Por favor, agregue un ejemplo ... –

+0

@tawman: Tener millones de registros en la memoria puede * absolutamente * ser práctico (y sorprendentemente rápido) dependiendo del tamaño del registro. En un trabajo anterior, logré aumentar el rendimiento * enormemente * convirtiendo el código que realizaba una búsqueda en una tabla de base de datos en una en memoria, ajustado para reducir el uso de memoria. Todo depende del contexto. –

Respuesta

6

Parece que, básicamente, sólo necesita un HashSet<T> que contiene todos los valores de propiedad - asumiendo usted realmente solo quiere saber si está contenido o no.

Por ejemplo:

var allNames = new HashSet<string>(people.Select(person => person.Name)); 
+1

He editado mi pregunta para presentar un ejemplo rápido de lo que estoy buscando. ¿Sería el HashSet más rápido que un diccionario en mi caso particular? –

+0

@Sean: Potencialmente, puede obtener una mejor coherencia de caché porque no hay un "valor" para almacenar. Definitivamente sería más eficiente con la memoria (suponiendo una implementación sensata). Lo que es más importante, un conjunto representa lo que le interesa (la presencia o ausencia de algo) con más precisión que un diccionario (que representa una asignación de clave/valor *). –

+0

Cuando lo pones de esa manera, parece que es más apropiado para mi problema específico. Como mencionaste, una asignación de clave/valor, aunque presente en mi ejemplo, es solo un medio para un fin, que muy probablemente aún se pueda ilustrar a través de un HashSet. Lo probaré, gracias! –

0

Depende. Si puede cargar los datos en un diccionario una vez y luego consultarlos varias veces, entonces un diccionario es claramente la estructura de datos más rápida posible. Si varios elementos pueden tener el mismo valor de propiedad, deberá crear un Dictionary<TKey,List<TValue>> o utilizar una búsqueda LINQ.

Sin embargo, si tiene que cargar la lista cada vez que la consulta, entonces no hay beneficio en el uso de un diccionario. Puede detectar las propiedades correctas mientras carga la lista o, si está consultando una base de datos, luego intente cargar solo los datos requeridos utilizando una cláusula WHERE apropiada.

Cuestiones relacionadas