2012-05-08 6 views
22

Actualmente tengo la siguiente sintaxis (la lista es una lista que contiene los objetos con muchas propiedades diferentes (donde título es uno de ellos):encontrar el artículo en ObservableCollection sin necesidad de utilizar un bucle

for (int i=0; i < list.Count; i++) 
{ 
    if(title == list[i].Title) 
    { 
    //do something 
    } 
} 

¿Cómo puedo acceder al list[i].Title sin tener que recorrer toda mi colección? Dado que mi lista tiende a crecer, esto puede afectar el rendimiento de mi programa.

Tengo mucha sintaxis similar en mi programa (accediendo a propiedades públicas a través de un ciclo for y por índice). Pero estoy seguro de que debe haber una manera mejor y más elegante de hacerlo?

El método find parece ser una opción ya que mi lista contiene objetos.

+0

Busque LINQ to Objects. – Phil

+0

Puede usar linq, como [Buscar] (http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx) o puede implementar su propio diccionario con soporte para [INotifyCollectionChanged] (http: // msdn .microsoft.com/es-us/library/system.collections.specialized.inotifycollectionchanged.aspx) – dowhilefor

+0

Un diccionario tiene una búsqueda muy rápida en la clave, pero la clave debe ser única. Como el título no es único, teme que se requiera un ciclo. Optimiza la clase para asegurarte Title get; no es descuidado Si el objeto tiene una clave primaria interna, anule GetHashCode con la clave. – Paparazzi

Respuesta

36

No sé qué quiere decir exactamente , pero technially hablando, esto no es posible sin un bucle.

Puede ser que quiere decir utilizando un LINQ, como por ejemplo:

list.Where(x=>x.Title == title) 

Vale la pena mencionar que la iteración sobre no se salta, sino simplemente envuelto en la consulta LINQ.

Espero que esto ayude.

EDITAR

En otras palabras, si usted realmente preocupado por el rendimiento, tenga codificación de la forma en que ya lo están haciendo. De lo contrario, elija LINQ para obtener una sintaxis más concisa y clara.

+0

Así que básicamente mi sintaxis está bien? Me preguntaba sobre el rendimiento, de ahí mi pregunta. – PeterP

+0

Generalmente es mucho más rápido que LINQ, pero como puedes ver también, hay muchas más líneas de código, LINQ tiene mucho más consistencia en su escritura. – Tigran

+0

Bien, gracias, supongo que me quedaré con mis declaraciones porque el rendimiento es realmente importante en mi programa. – PeterP

25

Aquí viene LINQ:

var listItem = list.Single(i => i.Title == title); 

lanza una excepción si no hay objeto que se ajuste el predicado. Alternativamente, está SingleOrDefault.

Si desea una colección de elementos que coincidan con el título, hay:

var listItems = list.Where(i => i.Title == title); 
+1

Esta es la respuesta para cualquiera que busque encontrar un objeto que cumpla un criterio específico. – visc

1

Usted está buscando una colección basada almohadilla (como un diccionario o hashset), que ObservableCollection no lo es. La mejor solución podría ser derivar de una colección basada en hash e implementar INotifyCollectionChanged, que le dará el mismo comportamiento que un ObservableCollection.

1

ObservableCollection es una lista por lo que si no conoce la posición del elemento tiene que mirar cada elemento hasta encontrar el esperado.

Posible optimización Si sus elementos están ordenados, utilice una búsqueda binaria para mejorar el rendimiento, de lo contrario utilice un diccionario como índice.

3

Considere crear un índice. Un diccionario puede hacer el truco. Si necesita la lista de semántica, subclase y mantener el índice como un miembro privado ...

2

Sugiero almacenar estos en un Hashtable. A continuación, puede acceder a un elemento en la colección con la tecla, es una búsqueda mucho más eficiente.

var myObjects = new Hashtable(); 
myObjects.Add(yourObject.Title, yourObject); 
... 
var myRetrievedObject = myObjects["TargetTitle"]; 
+0

También podría considerar usar un Diccionario used2could

0

Bien, si tiene N objetos y necesita obtener el Título de todos ellos, tiene que usar un bucle. Si solo necesita el título y realmente desea mejorar esto, tal vez pueda hacer una matriz separada que contenga solo el título, esto mejoraría el rendimiento. Debe definir la cantidad de memoria disponible y la cantidad de objetos que puede manejar antes de decir que esto puede dañar el rendimiento, y en cualquier caso la solución estaría cambiando el diseño del programa, no el algoritmo.

4

tuve que usarlo para añadir una condición si no se necesita el índice

using System.Linq; 

uso

if(list.Any(x => x.Title == title){ 
// do something here 
} 

esto le dirá si alguna satisface su condición de variable dada.

Cuestiones relacionadas