2011-10-19 4 views

Respuesta

13

Está haciendo un uso indebido Select cuando debería estar usando Where.

resultSet1.AddRange(resultSet2.Where(x => !names.Contains(x.City)); 

Select es un método de proyección. Toma una secuencia y la selecciona, a veces seleccionando el elemento completo, una sola propiedad o proyectándolo en otra cosa completamente distinta.

Where es un método de filtrado. Toma una secuencia y le aplica un predicado, produciendo solo los elementos que pasan el predicado.

(En su ejemplo, mediante el uso de Select, estás efectivamente se trata de añadir una lista de bool a una lista de CustomObject, que no se va a trabajar.)


No abordar el error específico a mano, aquí hay algunas ideas adicionales a considerar.

Esta es una situación donde HashSet<string> podría ser beneficioso para names, particularmente si names es significativamente grande. Contains en un HashSet<T> es de O (1) complejidad, mientras que es O (n) para List<T>. Sin embargo, hay una sobrecarga asociada con el HashSet, por lo que si tiene alguna duda, es mejor medir ambos y ver cuál es más eficiente.

Una cosa más que podría ayudar, si simplemente necesita transmitir una secuencia después de la otra y no necesariamente necesita cambiar o agregar a una colección, puede considerar usar operaciones Union o Concat.

var sequence = resultSet1.Union(resultSet2.Where(x => !names.Contains(x.City))); 
var sequence = resultSet1.Concat(resultSet2.Where(x => !names.Contains(x.City))); 

La diferencia de los dos es que Union filtrará los duplicados en la secuencia resultante (desde ambas entradas, no sólo el segundo contra la primera), Concat aplica ninguna lógica duplicado de filtrado y simplemente transmisión de una secuencia después del otro Las secuencias de entrada (resultSet1 y resultSet2) no están modificadas.

Cuestiones relacionadas