Я пытаюсь найти объект в списке значений на основе другого значения с помощью лямбда-выражения с помощью метода Находки. В этом примере я ожидаю возвращаться-1000, но ни за что в жизни, я просто не могу придумать надлежащее lamda выражение. Если это звучит как путание, я надеюсь, что код и комментарии ниже объясняют это лучше. TIA.
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 позволяют мне поместить свои намерения, немного более ясные путем определения всех ожидаемых результатов.
- 1000 и меньше к-101 должен дать-1000
- 100 к - 11 должен дать-100
- 10 к-1 должен дать-10
От 0 до 9 должен дать 0
10 - 99 должен дать 10
100-999 должен дать 100
1000 или больше должен дать 1000
Это должно работать:
values.FindLast(x => amount >= x.Value);
Сделать то же предположение, что и Darksider. Другой вариант -
MyValue fVal = values.Find(x => Math.Abs(x.Value) > amount && (x.Value<0 == amount<0));
, конечно, это зависит от уже отсортированного списка. Решение Darksider может быть лучше, если список не может быть отсортирован в течение всего дня.
Я предполагаю, что если вы использовали значение +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();
Вы совершили логическую ошибку ... значение не может быть одновременно> -200 И <-200 .. Вам нужно выражение ИЛИ ("||")
MyValue fVal = values.Find(x => (x.Value > amount) || (x.Value < amount));
Но если вы ожидаете получить -1000 это выражение также неверно
MyValue fVal = values.Find(x => (x.Value < amount));
Потому что -1000 МЕНЬШЕ, чем -200
РЕДАКТИРОВАТЬ: Хорошо, я думаю, я не понял ваше намерение. Но то, как вы хотите выбрать свою ценность, мне не кажется логичным. Хотите следующее меньшее значение?