2011-06-21 17 views
6

Tengo dos listas genéricas. Digamos que son List<A> y List<B>.Búsqueda rápida de la lista <T>

Clase A tiene una propiedad, que tipo es List<B>. Esta propiedad contiene objetos de tipo B, que se filtran por algunas otras propiedades del objeto A.

Así:

class A{ 
    public int Something1; 
    public int Something2; 
    public List<B> Something3; 
} 

class B{ 
    public int Anything1; 
    public int Anything2; 
} 

me gustaría añadir todos los objetos B como una lista de oponerse A (a propiedad llamada Something3), donde digamos objeto A.Something1 == B.Anything1.

Mi pregunta es: ¿cuál es la forma más eficiente de agregar List<B> elementos a List<A> artículos? Tenga en cuenta que puede haber cientos de miles de objetos en ambas listas.

(VS2010; C#; .Net4)

+4

Sería más fácil si acaba de publicar las definiciones de clase de sus clases en lugar de describirlas de esa manera. Sus explicaciones son innecesariamente difíciles de seguir. No necesariamente la definición de clase completa, sin embargo, solo las partes relevantes. –

+0

@Jeff Lo arreglé para él – Earlz

+0

Thx y perdón por eso – Tom

Respuesta

5

Grupo de los B 's en la propiedad Anything1 y poner en un diccionario. A continuación, puede recorrer los A 's y eficiente recoger la lista de B' s:

Dictionary<int, List<B>> beegroups = bees.GroupBy(b => b.Anything1).ToDictionary(g => g.Key, g => g.ToList()); 

foreach (A a in ayes) { 
    List<B> group; 
    if (beegroups.TryGetValue(a.Something1, out group)) { 
    a.Something3 = group; 
    } 
} 
+0

¡Muchas gracias, funciona genial y muy rápido! – Tom

0

me gustaría utilizar un mapa Comprobar si existe en la lista B antes de añadir a la lista A

2

Si hay tantos datos como usted ha mencionado, la el rendimiento de la selección & operaciones de inserción es el siguiente orden.

Desde el Generic Dictionaries in C#:

  1. Dictionary<int,A>

    • Seleccionar: O (1) (complejidad que significa)
    • Añadir: O (1) [u O (n)]
    • Basado en una tabla hash
  2. SortedDictionary<int,A>

    • Seleccionar: O (log n)
    • Añadir: O (log n)
    • Sobre la base de un árbol binario de búsqueda
  3. SortedList<int,A>

    • Seleccione: O (log n) [o O (n)]
    • Añadir: O (n)
    • Sobre la base de una colección ordenada (array de tamaño considerable)

Tenga en cuenta que si el número de datos es relativamente pequeño, List<int, A> sería bueno. (Dependiendo del tamaño de los datos, el orden anterior podría ser reorganizado.)

Mientras tanto, debe tener en cuenta la capacidad del tipo Collection en C#. El tipo Collection es de tamaño variable, por lo que si el tamaño es insuficiente, la colección se vuelve a crear como más grande que antes y los elementos se insertan de nuevo. Este punto le dice que si ya conoce el tamaño de la Colección, debe establecer la capacidad en el constructor de la Colección.

0

Aquí hay un enfoque alternativo que utiliza LINQ de manera más efectiva y no solo reemplaza las listas en cada A. Use una unión de grupo y agregue los elementos en cada grupo al A correspondiente.

List<A> myAs = ...; 
List<B> myBs = ...; 

var pairs = from a in myAs 
      join b in myBs on a.Something1 equals b.Anything1 into TheseBs 
      select new { A = a, TheseBs }; 

foreach (var pair in pairs) 
{ 
    pair.A.Something3.AddRange(pair.TheseBs); 
} 
Cuestiones relacionadas