c # Найти значение в диапазоне, используя лямбду - PullRequest
6 голосов
/ 21 мая 2010

Я пытаюсь найти элемент в списке значений на основе другого значения, используя лямбда-выражение с помощью метода Find. В этом примере я ожидаю получить -1000, но из-за жизни я просто не могу придумать правильное выражение лямды. Если это звучит странно, я надеюсь, что код и комментарии ниже объяснят это лучше. ТИА.

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

Ответы [ 4 ]

8 голосов
/ 21 мая 2010

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

values.FindLast(x => amount >= x.Value);
2 голосов
/ 21 мая 2010

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

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

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

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

Потому что -1000 меньше, чем -200

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

1 голос
/ 21 мая 2010

Я предполагаю, что если бы вы использовали значение +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 голосов
/ 21 мая 2010

Делая такое же предположение, как Darksider. Другой вариант будет

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

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

...