2010-09-29 11 views
12

Hola Obtuve el siguiente linq para ordenar mi entrada después del valor más bajo. Pero me gustaría que solo muestre los valores más bajos.Seleccione solo los valores más bajos con Linq

var sortedDict = (from entry in x where entry.Value > 0 orderby entry.Value ascending select entry); 

Ahora si recibe la siguiente entrada.

3 4 2 6 2 

Esta sería mi salida

2 2 3 4 6 

¿Qué necesito cambiar en mi LINQ tan solo me dan esta salida

2 2 

Respuesta

28

Bueno, usted podría hacer:

int min = x.Min(entry => entry.Value); 
var lowestValues = x.Where(entry => entry.Value == min); 

Tenga en cuenta que he dividido explícitamente estas arriba, como si utiliza Where(entry => entry.Value == x.Min(y => y.Value)) buscará el mínimo en cada iteración . Por otro lado, eso es cierto para LINQ to Objects, pero en LINQ to SQL probablemente sea mejor para hacerlo todo en una consulta, y deje que la base de datos lo resuelva.

+0

¿Será esto más rápido que la respuesta de KJN? ¿Esta respuesta provocará que se vuelva a calcular Mín() para cada entrada dentro de la lista de datos, o el compilador realizará un almacenamiento en caché de este valor? Lo dudo, pero me gustaría que lo confirme de una forma u otra. –

+0

Sí, generalmente será más rápido. :) – kjn

+0

@ Øyvind Bråthen: Si está utilizando LINQ to Objects, entonces yes - Min() se volverá a calcular para cada entrada en la lista. –

8

Usted podría intentar algo como esto:

data.Where (d => d == data.Min()) 

Nota esto no es necesario ssarily la manera más rápida de hacer esto.

+0

Gracias por su ayuda KJN – gulbaek

+0

Si almacena en caché data.Min() en una variable, puede tomar esto de O (n^2) a O (n). Estoy haciendo una suposición sobre la implementación de estas funciones linq y el compilador C#. – JSideris

5

En primer lugar, encontrar el valor más bajo:

var min = (from entry in x where entry.Value > 0 select entry).Min(); 

A continuación, seleccionar elementos:

var sortedDict = from entry in x where entry.Value == min select entry 

de clasificación es que no necesita para su escenario.

+2

Gracias por ser el único que volvió a verificar los números por encima de 0 :-) – gulbaek

Cuestiones relacionadas