2011-11-03 5 views
6

John Skeets responde a esta pregunta, Select all unique combinations of a single list, with no repeats, using LINQ, funciona asombrosamente.Seleccione todas las combinaciones únicas de una sola lista, sin repeticiones, usando LINQ (Parte 2)

Sin embargo, alguien puede romper componente a componente del funcionamiento interno de cómo está funcionando la primera respuesta:

List<int> slotIds = new List<int> {1, 2, 3}; 
var query = slotIds.SelectMany((value, index) => slotIds.Skip(index + 1), 
           (first, second) => new { first, second }); 
+2

¿Y por qué no preguntas eso en un comentario bajo esa respuesta? –

Respuesta

6

Es más o menos equivalente en concepto a esto, aunque el modelo de ejecución real es diferente, por supuesto, (perezoso etc):

for (int i = 0; i < slotIds.Count; i++) 
{ 
    int first = slotIds[i]; 
    for (int j = i + 1; j < slotIds.Count; j++) 
    { 
     int second = slotIds[j]; 
     results.Add(new { first, second }); 
    } 
} 

El SelectMany teniendo una proyección de value y index es una forma de usar ambos first y i para hacer un bucle interno. Necesitamos el índice para que podamos omitir los valores index + 1, que es equivalente al bucle j que comienza en i + 1 en el código anterior.

¿Eso ayuda? Si no, ¿podrías señalar qué bit es confuso?

EDIT: Aargh - ¡No me había dado cuenta de que la otra pregunta a la que se refería comenzaba con este código! Creo que sigue siendo útil, sin embargo, para dar al párrafo siguiente algo para colgar ...

Si entendiste la versión alternativa (expresión de consulta) de mi respuesta, entonces la primera versión es similar, simplemente usando una sobrecarga de SelectMany que le permite usar tanto el valor como el índice en la secuencia "exterior".

+0

Así que está utilizando esta versión sobrecargada de SelectMany, http://msdn.microsoft.com/en-us/library/bb534732.aspx, por lo que collectionSelector crea el "bucle interno", es decir. {2, index = 1} {3, index = 2} y el resultado de eso alimenta el selector de resultados (segunda función lambda)? Entiendo tus otros ejemplos, creo que mi confusión es con las funciones lambda y cómo la segunda función lambda construye la lista. – Seth

+0

@Seth: El selector de colecciones es el bit que obtiene el equivalente de 'i' y' first' en el código en esta respuesta. Esos valores (i y primero) se usan luego en 'resultSelector'. –

Cuestiones relacionadas