2010-05-21 46 views
5

Tôi đang cố gắng tìm một mục trong danh sách giá trị dựa trên giá trị khác sử dụng biểu thức lambda bằng cách sử dụng phương thức Tìm. Trong ví dụ này, tôi mong đợi để lấy lại -1000, nhưng đối với cuộc sống của tôi, tôi không thể đưa ra biểu thức chính xác của lamda. Nếu điều đó có vẻ khó hiểu, tôi hy vọng mã và nhận xét dưới đây sẽ giải thích rõ hơn. TIA.C# Tìm giá trị trong phạm vi sử dụng 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 cho phép tôi đặt ý định rõ ràng hơn bằng cách chỉ định tất cả kết quả mong đợi.

-1000 và ít hơn để -101 nên cung cấp cho -1000
-100 đến - 11 nên cung cấp -100
-10 -1 nên cung cấp cho -10
0-9 nên cung cấp cho 0
10-99 nên cung cấp cho 10
100-999 nên cung cấp cho 100
1000 hoặc hơn nên cung cấp cho 1000

+0

Nếu bạn sử dụng +200, bạn mong đợi điều gì? – Darksider

+0

Nếu bạn sử dụng -100, bạn có mong đợi -1000 hoặc -100 như là kết quả không? –

Trả lời

6

này nên làm việc:

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

Tuyệt vời đây là percect. Làm thế nào tao nhã! – n4rzul

+0

Giữ trên, có thể không 100% này phục vụ cho tất cả các trường hợp thậm chí 10000000 mà nên cung cấp cho 1000 nhưng nó không phục vụ cho -100000 mà nên cung cấp cho -1000.Tôi chỉ có thể thêm một giá trị âm rất rất lớn vào đầu danh sách của tôi mặc dù và nó sẽ làm việc tốt. – n4rzul

2

Bạn đã làm một sai lầm logic ... một giá trị không thể> -200 VÀ < -200 cùng một lúc. U cần biểu thức OR ("||")

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

Nhưng nếu bạn mong đợi để có được -1000 biểu hiện này cũng là sai

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

Vì -1000 nhỏ hơn -200

EDIT: Ok Tôi nghĩ tôi missunderstood ý định của bạn. Nhưng cách bạn muốn chọn giá trị của bạn dường như không hợp lý với tôi. Bạn có muốn giá trị nhỏ hơn tiếp theo không?

+0

Tôi đã cập nhật câu hỏi chính, với tất cả các kết quả mong đợi. Xin vui lòng xem ở đó. Những gì tôi về cơ bản muốn là để làm một giữa như bạn sẽ trong một câu lệnh SQL khi tìm kiếm kết quả nằm giữa hai ngày, ngoại trừ đây là những con số. EG: SELECT * FROM Users ĐÂU CreationDate> '2010-03-01' VÀ CreationDate < '2010/03/31' nào tìm thấy tất cả người dùng giữa ngày 01 tháng 3 và 31 tháng 3 Hy vọng điều này làm cho ý nghĩa – n4rzul

1

Tôi đang làm cho giả định rằng nếu bạn sử dụng các giá trị +90, bạn mong muốn 100 và không không, cũng như nếu bạn sử dụng 200, bạn đang mong 1000 và không 100.

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

không, cách khác vòng – n4rzul

0

làm giả định giống như Darksider Một lựa chọn khác sẽ là

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

của khóa học này dựa vào danh sách đã được sắp xếp. Giải pháp của Darksider có thể tốt hơn nếu danh sách có thể không được sắp xếp alreday.

+0

Julien hoạt động chính xác trong trường hợp của tôi ngoại trừ các giá trị âm rất nhỏ. Tôi sẽ chỉ thêm một giá trị âm rất nhỏ trong danh sách và tất cả sẽ ổn. – n4rzul

Các vấn đề liên quan