2009-07-23 11 views
11

Tengo la siguiente matriz de enteros:¿Cómo obtener los 3 elementos principales en una matriz int usando LINQ?

int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 }; 

me escribió el siguiente código para obtener los 3 primeros elementos de la matriz:

var topThree = (from i in array orderby i descending select i).Take(3); 

Cuando compruebo lo que hay dentro de la topThree, encuentro:

{} System.Linq.Enumerable.TakeIterator
cuenta: 0

¿Qué hice mal y cómo puedo corregir mi código?

+4

El objeto en topThree no es el * results *, es la * query *. topThree es un objeto que significa "ordenar la secuencia de elementos en una matriz de mayor a menor y tomar los primeros tres". Eso es * todo * significa. NO significa "8, 6, 5". Significa la * consulta *, no los * resultados *. Puede demostrar esto ejecutando la consulta, luego cambiando la matriz y luego ejecutando la consulta nuevamente. La consulta es exactamente la misma, pero los resultados son diferentes. –

Respuesta

23

¿Cómo "verificas qué hay dentro de los topThree"? La forma más sencilla de hacerlo es a imprimirlos:

using System; 
using System.Linq; 

public class Test 
{ 
    static void Main()   
    { 
     int[] array = new int[7] { 1, 3, 5, 2, 8, 6, 4 }; 
     var topThree = (from i in array 
         orderby i descending 
         select i).Take(3); 

     foreach (var x in topThree) 
     { 
      Console.WriteLine(x); 
     } 
    } 
} 

ve bien a mí ...

potencialmente hay formas más eficientes de encontrar los mejores valores de N de la clasificación, pero esto sin duda trabajar . Es posible que desee considerar el uso de la notación de puntos para una consulta que sólo hace una cosa:

var topThree = array.OrderByDescending(i => i) 
        .Take(3); 
+0

lo comprobé en el QuickWatch. Gracias por dejar las cosas más claras. –

+2

QuickWatch es probablemente conservador, tratando de no ejecutar código para usted a menos que realmente se lo pida. La consulta en realidad no tiene los datos, solo sabe cómo acceder a los datos. Obtener los datos podría ser lento o podría tener efectos secundarios, por lo que es una mala idea mostrar esos datos en el depurador de forma predeterminada. –

+0

"Hay formas potencialmente más eficientes de encontrar los valores superiores de N que la clasificación" - ¿Puede proporcionar un ejemplo de un método más eficiente? –

11

Su código parece bien a mí, que tal vez desea obtener el resultado de nuevo a otra matriz?

int[] topThree = array.OrderByDescending(i=> i) 
         .Take(3) 
         .ToArray(); 
3

Es debido a la ejecución retrasada de la consulta linq.

Como se sugiere si agrega .ToArray() o .ToList() o similar, obtendrá el resultado correcto.

-1
int[] intArray = new int[7] { 1, 3, 5, 2, 8, 6, 4 };    
int ind=0; 
var listTop3 = intArray.OrderByDescending(a=>a).Select(itm => new { 
    count = ++ind, value = itm 
}).Where(itm => itm.count < 4); 
Cuestiones relacionadas