2012-01-26 15 views
14

Tengo dos objetos:consulta LINQ entre dos objetos de lista

ObjectA 
{ 
    string code; 
    string country; 
} 

ObjectB 
{ 
    string code; 
    string otherstuff; 
} 

y no tengo List<objectA> y List<ObjectB> y tengo que encontrar todos los objetos en List<ObjectB> que contiene objectA.Code. Pero no se las puede arreglar para implementarlo en la consulta LINQ.

+2

1. ¿Tiene un solo 'objectA' o que lo necesite para todos los objetos de la lista' '. 2. ¿Cuál es el diseño del resultado que espera? 3. ¿Qué has intentado hasta ahora? – Krizz

+0

Eche un vistazo a IEnumerable.Intersect: http://msdn.microsoft.com/en-us/library/bb460136.aspx Debe sobrescribir 'Equals' y' GetHashCode' en ambos y permitir comparar entre sí a través de 'Código'. –

Respuesta

29

Parece que está intentando encontrar todas las instancias de ObjectB que tienen un valor code presente en cualquiera de los valores List<ObjectA>. Si a fin de tratar el siguiente

List<ObjectA> listA = ...; 
List<ObjectB> listB = ...; 
var all = listB.Where(b => listA.Any(a => a.code == b.code)); 
6

Para hacerlo con eficacia por primera vez puede poner los códigos en un HashSet<string> y luego utilizar una consulta Contains() para comprobar si el B en cuestión tiene un código que se contiene en el hashset:

var codes = new HashSet<string>(listOfAs.Select(x => x.code)); 
var selectedBs = listOfBs.Where(x=> codes.Contains(x.code)); 
14

Parece que desea unirse a la lista de ObjectA con la lista de ObjectB en la propiedad code. Esta es una manera:

List<ObjectA> listOfA = ...; 
List<ObjectB> listOfB = ...; 
var all = from a in listOfA 
      join b in listOfB on a.code equals b.code 
      select new {a,b}; 

El resultado es una lista de objetos anónimos, que contiene 2 propiedades: una de tipo Objecta, B de tipo ObjectB, con la misma code

5

Me volvería a poner los códigos de la ObjectA lista en un HashSet, de lo contrario su consulta se convertiría en una operación O (n). Al igual que este es un O (n) la operación:

var aList = new List<ObjectA>(); 
var bList = new List<ObjectB>(); 

var aCodes = new HashSet<string>(aList.Select(a => a.code)); 
var result = bList.Where(b => aCodes.Contains(b.code)); 
+0

Gracias Olivier. ¿Conoces algún buen tutorial en linq o libros con ejemplos de velocidad, etc.? – Reno

+2

Para LINQ Google [tutorial de LINQ C#] (http://www.google.com/search?q=LINQ+tutorial+C%23). En cuanto a la velocidad, lo que es relevante aquí, es tener un conocimiento básico de los diferentes tipos de colecciones junto con sus pros y contras. James Michael Hare ofrece una buena visión general aquí: [Elegir la clase de recopilación correcta] (http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class .aspx) –

Cuestiones relacionadas