2010-05-21 5 views
5

Ich versuche, ein Element in einer Liste von Werten zu finden, die auf einem anderen Wert basieren, wobei ein Lambda-Ausdruck mit der Find-Methode verwendet wird. In diesem Beispiel erwarte ich, -1000 zurückzubekommen, aber für mein Leben kann ich einfach nicht den richtigen Lambda-Ausdruck finden. Wenn das verwirrend klingt, hoffe ich, dass der Code und die Kommentare es besser erklären. TIA.C# Wert in einem Bereich mit Lambda finden

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 lassen Sie mich meine Absichten ein wenig klarer machen, indem Sie alle erwarteten Ergebnisse angeben.

-1000 und weniger auf -101 geben sollte -1000
-100 bis - 11 -100
geben sollte -10 bis -1 geben sollte -10
0 bis 9 0
10 bis 99 geben sollte geben soll 10
100-999 geben soll 100
1000 oder mehr soll 1000

+0

Wenn Sie +200 verwenden, was erwarten Sie? – Darksider

+0

Wenn Sie -100 verwenden, erwarten Sie als Ergebnis -1000 oder -100? –

Antwort

6

Dies sollte funktionieren:

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

Ehrfürchtig ist dies Percect. Wie elegant! – n4rzul

+0

Halten Sie, vielleicht nicht 100% Dies bietet für alle Instanzen sogar 10000000, die 1000 ergeben sollte, aber es nicht für -100000, was -1000 ergeben sollte.Ich könnte jedoch nur einen sehr sehr großen negativen Wert zum Anfang meiner Liste hinzufügen, und es sollte gut funktionieren. – n4rzul

2

Sie geben einen logischen Fehler gemacht haben ... ein Wert> -200 und -200 < zugleich sein kann. . U benötigt den OR-Ausdruck ("||")

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

Aber wenn Sie erwarten, -1000 dieser Ausdruck zu bekommen, ist auch falsch

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

Da -1000 kleiner als -200

EDIT ist: Ok Ich glaube, ich missunderstood Ihre Absicht. Aber die Art, wie Sie Ihren Wert auswählen möchten, erscheint mir nicht logisch. Willst du den nächsten kleineren Wert?

+0

Ich habe die Hauptfrage aktualisiert, mit allen erwarteten Ergebnissen. Bitte sehen Sie dort. Was ich im Grunde will, ist ein Zwischenschritt wie in einer SQL-Anweisung, wenn nach Ergebnissen gesucht wird, die zwischen zwei Daten liegen, mit Ausnahme von Zahlen. Beispiel: SELECT * FROM Benutzer WHERE ErstellDatum> '2010-03-01' UND ErstellDatum < '2010-03-31' das alle Benutzer zwischen 1. März und 31. März findet Hope this macht Sinn – n4rzul

1

ich die Annahme mache, dass, wenn Sie den Wert +90 verwendet, Sie zu 100 erwarten würde und nicht Null ist, als auch, wenn Sie 200 verwenden, Sie erwarten 1000 und nicht 100.

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

Nö, anders herum – n4rzul

0

die gleiche Annahme wie Darksider machen Eine weitere Option

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

natürlich wäre dieser hängt davon ab, dass die Liste bereits sortiert ist. Die Lösung von Darksider könnte besser sein, wenn die Liste möglicherweise schon nicht sortiert ist.

+0

Julien funktioniert in meinem Fall richtig, außer für sehr kleine negative Werte. Ich füge nur einen sehr kleinen negativen Wert in die Liste ein und alles sollte in Ordnung sein. – n4rzul