LINQ to find the closest number that is greater / less than an input

后端 未结 8 638
猫巷女王i
猫巷女王i 2021-02-05 19:57

Suppose I have this number list:

List = new List(){3,5,8,11,12,13,14,21}

Suppose that I want to get the closest number th

相关标签:
8条回答
  • 2021-02-05 20:56

    with Linq assuming that the list is ordered I would do it like this:

    var l = new List<int>() { 3, 5, 8, 11, 12, 13, 14, 21 };
    var lessThan11 = l.TakeWhile(p => p < 11).Last();
    var greaterThan13 = l.SkipWhile(p => p <= 13).First();
    

    EDIT:

    As I have received negative feedback about this answer and for the sake of people that may see this answer and while it's accepted don't go further, I explored the other comments regarding BinarySearch and decided to add the second option in here (with some minor change).

    This is the not sufficient way presented somewhere else:

    var l = new List<int>() { 3, 5, 8, 11, 12, 13, 14, 21 };
    var indexLessThan11 = ~l.BinarySearch(10) -1;
    var value = l[indexLessThan11];
    

    Now the code above doesn't cope with the fact that the value 10 might actually be in the list (in which case one shouldn't invert the index)! so the good way is to do it:

    var l = new List<int>() { 3, 5, 8, 11, 12, 13, 14, 21 };
    var indexLessThan11 = l.BinarySearch(10);
    if (indexLessThan11 < 0) // the value 10 wasn't found
    {    
        indexLessThan11 = ~indexLessThan11;
        indexLessThan11 -= 1;
    }
    var value = l[indexLessThan11];
    

    I simply want to note that:

    l.BinarySearch(11) == 3
    //and
    l.BinarySearch(10) == -4;
    
    0 讨论(0)
  • 2021-02-05 20:57

    closest number below 11:

            int someNumber = 11;
            List<int> list = new List<int> { 3, 5, 8, 11, 12, 13, 14, 21 };
    
            var intermediate = from i in list
                         where i < someNumber
                         orderby i descending
                         select i;
    
            var result = intermediate.FirstOrDefault();
    

    closest number above 13:

            int someNumber = 13;
            List<int> list = new List<int> { 3, 5, 8, 11, 12, 13, 14, 21 };
    
            var intermediate = from i in list
                         where i > someNumber
                         orderby i
                         select i;
    
            var result = intermediate.FirstOrDefault();
    
    0 讨论(0)
提交回复
热议问题