2010-05-21 21 views
5

Próbuję znaleźć element na liście wartości na podstawie innej wartości, używając wyrażenia lambda za pomocą metody Znajdź. W tym przykładzie spodziewam się odzyskać -1000, ale dla mojego życia po prostu nie mogę wymyślić właściwej ekspresji lamda. Jeśli to brzmi myląco, mam nadzieję, że kod i komentarze poniżej wyjaśnią to lepiej. TIA.C# Znajdź wartość w zakresie używając 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 powiem moje intencje trochę wyraźniejsze, określając wszystkie oczekiwane rezultaty.

-1000 do -101 i mniej powinny -1000
-100 do - 11 powinny -100
-10 do -1 powinny -10
0 do 9 powinny 0
10 99 powinno dać 10
100-999 powinien dać 100
1000 lub więcej powinny dać 1000

+0

Jeśli używasz +200, czego się spodziewasz? – Darksider

+0

Jeśli używasz -100, czy oczekujesz -1000 lub -100? –

Odpowiedz

6

To powinno działać:

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

Niesamowite, to percect. Jak elegancko! – n4rzul

+0

Trzymaj się, być może nie w 100%, to odpowiada wszystkim instancjom nawet 10000000, które powinny dać 1000, ale nie obsługuje ono -100000, które powinno dać -1000.Mogłem dodać bardzo dużą ujemną wartość do początku mojej listy i powinno to działać dobrze. – n4rzul

2

Zrobiłeś logiczny błąd ... to jest wartość nie może być> -200 -200 < i w tym samym czasie. U potrzebujesz wyrażenia OR ("||")

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

Ale jeśli można oczekiwać, aby dostać -1000 to wyrażenie jest źle

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

Ponieważ -1000 jest mniejszy niż -200

EDIT: Ok myślę missunderstood swój zamiar. Ale sposób, w jaki chcesz wybrać swoją wartość, nie wydaje mi się logiczny. Czy chcesz uzyskać następną mniejszą wartość?

+0

Mam zaktualizowane główne pytanie, z wszystkimi oczekiwanymi wynikami. Proszę zobaczyć. To, czego zasadniczo chcę, to zrobić między takimi, jak w instrukcji SQL podczas wyszukiwania wyników, które przypadają między dwiema datami, z wyjątkiem tych liczb. EG: SELECT * FROM użytkowników GDZIE CreationDate> '2010-03-01' I CreationDate < '2010-03-31' Który znajdzie wszystkich użytkowników pomiędzy 1 Mar i 31 Mar. nadzieję, że to sprawia, sens – n4rzul

1

robię założenie, że jeśli użyto wartości +90, czego można oczekiwać 100 i nie zerowe, a także, jeśli używasz 200, czekasz 1000 a nie 100.

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

nie, w inny sposób – n4rzul

0

Dokonywanie tego samego założenia, co Darksider Innym rozwiązaniem byłoby

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

oczywiście tego opiera się na już sortowanej liście. Rozwiązanie Darksider może być lepsze, jeśli lista może nie zostać posortowana.

+0

Julien działa poprawnie w moim przypadku, z wyjątkiem bardzo małych wartości ujemnych. Dodam tylko bardzo małą wartość ujemną na liście i wszystko powinno być w porządku. – n4rzul

Powiązane problemy