c# Находят значение в диапазоне с помощью лямбды

Я пытаюсь найти объект в списке значений на основе другого значения с помощью лямбда-выражения с помощью метода Находки. В этом примере я ожидаю возвращаться-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

6
задан n4rzul 21 May 2010 в 11:58
поделиться

4 ответа

Это должно работать:

values.FindLast(x => amount >= x.Value);
8
ответ дан 9 December 2019 в 22:30
поделиться

Сделать то же предположение, что и Darksider. Другой вариант -

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

, конечно, это зависит от уже отсортированного списка. Решение Darksider может быть лучше, если список не может быть отсортирован в течение всего дня.

0
ответ дан 9 December 2019 в 22:30
поделиться

Я предполагаю, что если вы использовали значение +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();
1
ответ дан 9 December 2019 в 22:30
поделиться

Вы совершили логическую ошибку ... значение не может быть одновременно> -200 И <-200 .. Вам нужно выражение ИЛИ ("||")

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

Но если вы ожидаете получить -1000 это выражение также неверно

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

Потому что -1000 МЕНЬШЕ, чем -200

РЕДАКТИРОВАТЬ: Хорошо, я думаю, я не понял ваше намерение. Но то, как вы хотите выбрать свою ценность, мне не кажется логичным. Хотите следующее меньшее значение?

2
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: