2010-05-21 301 views
5

我试图使用Find方法使用lambda表达式在基于另一个值的值列表中查找项目。在这个例子中,我期待回到-1000,但对于我的生活,我不能拿出适当的lamda表达。如果这听起来令人困惑,我希望下面的代码和评论能更好地解释它。 TIA。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; 
     }   
    } 
} 

嗯,让我通过指定所有预期的结果使我的意图更清晰一点。

-1000,少到-101应该给-1000
-100〜 - 11应该给-100
-10至-1应该给-10
0到9应该给0
10〜99应该给10
100-999应给予100
1000或更多的应该得到1000个

+0

如果你使用+200,你期待什么? – Darksider 2010-05-21 11:35:33

+0

如果您使用-100,那么您是否期望-1000或-100? – 2010-05-21 11:50:02

回答

6

这应该工作:

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

真棒这是感知。多么优雅! – n4rzul 2010-05-21 12:13:52

+0

坚持,也许不是100%,这就迎合了所有的实例,甚至10000000这应该给1000,但它不符合-100000应该给-1000。我可以添加一个非常大的负值到我的列表开始,但它应该可以正常工作。 – n4rzul 2010-05-21 12:17:18

2

你做了一个逻辑错误......一个值不能在同一时间> -200和-200 <。 U需要OR表达式(“||”)

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

但是,如果你希望得到-1000这个表达式也是错误的

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

因为-1000小于-200

编辑:好吧,我想我missunderstood你的意图。但是你想选择你的价值的方式对我来说似乎不合逻辑。你想要更小的价值吗?

+0

我已更新了主要问题,并带有所有预期结果。请看那里。基本上我想要做的是像在SQL语句中搜索两个日期之间的结果一样,除了这些是数字之外。 EG: SELECT * FROM用户 WHERE CreationDate> '2010-03-01' AND CreationDate < '2010-03-31' 指找到3月1日和3月31日 希望之间的所有用户,这使得感 – n4rzul 2010-05-21 12:02:56

1

我做,如果你使用的值+90,你所期望的100,而不是零,以及如果使用200作为假设,你期待1000,而不是100

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

nope,其他方式 – n4rzul 2010-05-21 12:20:46

0

作出同样的假设Darksider另一种选择是

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

依赖于已经排序的列表。如果列表可能未被排序,Darksider的解决方案可能会更好。

+0

朱利安在我的情况下工作正常,除了非常小的负值。我只是在列表中添加一个非常小的负值,并且应该没问题。 – n4rzul 2010-05-21 12:19:30