2010-05-21 28 views
5

Estoy tratando de encontrar un elemento en una lista de valores basados ​​en otro valor utilizando una expresión lambda utilizando el método Find. En este ejemplo, espero recuperar -1000, pero por mi vida, no puedo encontrar la expresión lamda adecuada. Si eso suena confuso, espero que el código y los comentarios a continuación lo expliquen mejor. TIA.C# Encontrar el valor en un rango utilizando lambda

using System; 
using System.Collections.Generic; 

namespace TestingStuff { 
    class Program { 
     static void Main(string[] args) { 
      double amount = -200; 

      //The Range of values 
      List<MyValue> values = new List<MyValue>(); 
      values.Add(new MyValue(-1000)); 
      values.Add(new MyValue(-100)); 
      values.Add(new MyValue(-10)); 
      values.Add(new MyValue(0)); 
      values.Add(new MyValue(100)); 
      values.Add(new MyValue(1000)); 

      //Find it!!! 
      MyValue fVal = values.Find(x => (x.Value > amount) && (x.Value < amount)); 

      //Expecting -1000 as a result here since -200 falls between -1000 and -100 
      //if it were -90 I'd expect -100 since it falls between -100 and 0 
      if (fVal != null) 
       Console.WriteLine(fVal.Value);    
      Console.ReadKey(); 
     } 
    } 

    public class MyValue { 
     public double Value { get; set; } 
     public MyValue(double value) { 
      Value = value; 
     }   
    } 
} 

Mmm Permítanme poner mis intenciones un poco más claras al especificar todos los resultados esperados.

-1000 y menos a -101 debe dar -1000
-100 a - 11 debe dar -100
-10 a -1 debe dar -10
0 a 9 deberían dar 0
10 a 99 debe dar 10
100-999 debe dar el 100
1000 o más deben dar 1000

+0

Si usa +200, ¿qué está esperando? – Darksider

+0

Si usa -100, ¿espera que el resultado sea -1000 o -100? –

Respuesta

6

esto debería funcionar:

values.FindLast(x => amount >= x.Value); 
+0

Awesome this is percect. ¡Qué elegante! – n4rzul

+0

Espera, tal vez no es 100%. Esto satisface todas las instancias, incluso 10000000, que debería dar 1000 pero no da cabida a -100000, que debería dar -1000.Sin embargo, podría agregar un valor negativo muy grande al comienzo de mi lista y debería funcionar bien. – n4rzul

2

hiciste un error lógico ... un valor no puede ser> -200 -200 < Y al mismo tiempo. . U necesita la expresión OR ("||")

MyValue fVal = values.Find(x => (x.Value > amount) || (x.Value < amount)); 

Pero si usted espera conseguir -1000 esta expresión también está mal

MyValue fVal = values.Find(x => (x.Value < amount)); 

Debido -1000 es menor que -200

EDIT: Ok creo que Missunderstood su intención. Pero la forma en que desea seleccionar su valor no me parece lógica. ¿Quieres el siguiente valor más pequeño?

+0

He actualizado la pregunta principal, con todos los resultados esperados. Por favor mira allí. Lo que básicamente quiero es hacer un intermedio como lo haría en una declaración de SQL al buscar resultados que caen entre dos fechas, excepto que estos son números. Ejem: SELECT * FROM usuarios DONDE CreationDate> '2010-03-01' Y CreationDate < '2010-03-31' que encuentra todos los usuarios de entre 1 Mar y 31 de Mar. Espero que esto tenga sense – n4rzul

1

estoy haciendo la suposición de que si se ha utilizado el valor 90, lo que espera 100 y no es cero, así como si se utiliza 200, que está esperando 1000 y no 100.

MyValue fVal = values 
    .Where(x => amount > 0 ? x.Value > amount : x.Value < amount) 
    .OrderBy(x => amount > 0 ? x.Value : -x.Value).First(); 
+0

no, en sentido contrario – n4rzul

0

Haciendo el mismo supuesto que Darksider Otra opción sería

MyValue fVal = values.Find(x => Math.Abs(x.Value) > amount && (x.Value<0 == amount<0)); 

por supuesto esto se basa en la lista que ya está siendo ordenada. La solución de Darksider puede ser mejor si la lista no se ha ordenado ya.

+0

Julien funciona correctamente en mi caso a excepción de valores negativos muy pequeños. Añadiré un valor negativo muy pequeño en la lista y todo debería estar bien. – n4rzul

Cuestiones relacionadas