2010-08-13 23 views
11

Tengo una lista de números, y necesito crear cada combinación única posible de los números en la lista, sin repeticiones, usando una consulta LINQ. Entonces, por ejemplo, si tengo { 1, 2, 3 }, las combinaciones serían 1-2, 1-3 y 2-3.Seleccione todas las combinaciones únicas de una sola lista, sin repeticiones, usando LINQ

Actualmente utilizo dos for bucles, así:

for (int i = 0; i < slotIds.Count; i++) 
{ 
    for (int j = i + 1; j < slotIds.Count; j++) 
    { 
     ExpressionInfo info1 = _expressions[i]; 
     ExpressionInfo info2 = _expressions[j]; 

     // etc... 
    } 
} 

¿Es posible convertir estos dos bucles for a LINQ?

Gracias.

Respuesta

28

Claro - se puede hacer en una sola llamada a SelectMany con un componente implícito a Skip:

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

Aquí es una opción alternativa, que no utiliza bastante tal sobrecarga esotérico de SelectMany:

var query = from pair in slotIds.Select((value, index) => new { value, index }) 
      from second in slotIds.Skip(pair.index + 1) 
      select new { first = pair.value, second }; 

Estos hacen básicamente lo mismo, solo que de maneras ligeramente diferentes.

Aquí hay otra opción, que es mucho más cerca de su original:

var query = from index in Enumerable.Range(0, slotIds.Count) 
      let first = slotIds[index] // Or use ElementAt 
      from second in slotIds.Skip(index + 1) 
      select new { first, second }; 
+0

ver esto por una discusión sobre la primera solución esotérica: http://stackoverflow.com/questions/7991486/select-all-unique- combination-of-a-single-list-with-no-repeats-using-linq-pa – Thilo

+1

@David: No creo que ninguna de las colecciones en .NET devuelva elementos en un orden diferente cuando se repiten varias veces sin cambios entre. No nos importa cuál es el orden, siempre y cuando sea consistente. –

+0

Dangit, entonces tenemos el error más extraño en alguna parte, gracias borraré mis 2 comentarios: p – David

Cuestiones relacionadas