¿Cómo obtener el número más cercano de una Lista con LINQ?

¿Cómo obtener el número más cercano de una List con LINQ?

Por ejemplo:

 List numbers = new List(); numbers.Add(2); numbers.Add(5); numbers.Add(7); numbers.Add(10) 

Necesito encontrar el valor más cercano en la lista al número 9. En este caso 10.

¿Cómo puedo hacer esto con LINQ?

Si usa LINQ to Objects y la lista es larga, usaría:

 List list = new List { 2, 5, 7, 10 }; int number = 9; int closest = list.Aggregate((x,y) => Math.Abs(x-number) < Math.Abs(y-number) ? x : y); 

Este método es un poco más complejo que la solución que Anthony Pegram sugirió, pero tiene la ventaja de que no es necesario ordenar primero la lista. Esto significa que tiene una complejidad temporal de O(n) lugar de O(n*log(n)) y un uso de memoria de O(1) lugar de O(n) .

Si desea utilizar LINQ para realizar esta tarea, puede hacerlo como a continuación.

 List list = new List { 2, 5, 7, 10 }; int number = 9; // find closest to number int closest = list.OrderBy(item => Math.Abs(number - item)).First(); 

Las soluciones anteriores son todas O(N) en el mejor de los casos.

Si tiene una gran lista y realiza esta consulta de elemento más cercano varias veces, sería más O(NlogN) ordenar primero la lista ( O(NlogN) ) y luego usar List.BinarySearch para cada consulta. El rendimiento para k consultas es O( (k+N)logN ) , en comparación con O(kN) del método anterior.

Podrías hacer la búsqueda binaria. Es el método de comstackción en c # que lo ayudará a buscar el número más cercano. Aquí ejemplo: https://msdn.microsoft.com/en-us/library/y15ef976(v=vs.110).aspx

Utilice esto para obtener el más bajo o más bajo según las condiciones que utilizó.

  List list = new List { 2, 5, 7, 10 }; int number = 9; var closest = list.Where(numbers => numbers > number).First(); Console.WriteLine(closest); Console.ReadLine(); 

Espero que esto sea útil.