查找列表c#中的下一个最高和下一个最低数字

时间:2018-04-18 14:18:57

标签: c#

我有一个数字列表,如果我要查找的数字不在列表中,我希望能够找到上面列表中的下一个值,而不是我要求的数字。< / p>

double index = 5;
List<double> list = new List<double>() { 1, 2, 3, 7, 8, 9, };
//do code to find next highest/lowest
double higher = 7;
double lower = 3;
例如,因为5不完全在列表本身中,我希望它返回上下两个最接近5的下一个项目。所以对于这种情况,3和7。

6 个答案:

答案 0 :(得分:4)

更好的版本编辑

您使用List<T>后效率更高,有Find()方法接受谓词:

List<double> numbers = new List<double>()
{
    1, 2, 3, 7, 8, 9
};

double input = 5;

numbers.Sort();

double nextHighest = numbers.Find(x => x > input);
double nextLowest = numbers.Find(x => x < input);

找到匹配后exit the loop immediately LastOrDefault()必须iterate the entire collection

原始版本

免责声明:此解决方案效率最高,但这是我的原始答案,我将其保留为后代

您可以使用列表的Sort()方法,然后使用LINQ FirstOrDefault()LastOrDefault()

List<double> numbers = new List<double>()
{
    1, 2, 3, 7, 8, 9
};

double input = 5;

numbers.Sort();

double nextHighest = numbers.FirstOrDefault(x => x > input);
double nextLowest = numbers.LastOrDefault(x => x < input);

小提琴here

答案 1 :(得分:0)

LINQ的解决方案:

/* template code */
<template>
  <section>
    <h3>in board _id</h3>    
    <div>
        <div>type = {{type}}</div>
        <div>subtype = {{subtype}}</div>
        <div>id = {{id}}</div>
        <div>urlParam = {{$route.params}}</div>
    </div>
  </section>
</template>

/* script */
<script>
export default {
    /* variables */
    data(){
        return{
            type : null,
            subtype : null,
            id : null
        }
    },
    /* route validation */
    validate ({ params }) {
        return /^([0-9]{12,12})$/.test(params.id)
    },
    /* extracting url params */
    created(){
        var _id = this.$route.params.id;
        var regex = /^([0-9]{2,2})([0-9]{2,2})([0-9]{8,8})$/;
        var contents = _id.match(regex);
        this.type = contents[1];
        this.subtype = contents[2];
        this.id = contents[3]; 
    }
}
</script>

说明:首先对列表Ascending或Descending进行排序。之后,您所要做的就是找到更大或更小的数字;

如果您不想要例外,如果不存在更高/更低的值,您可能希望将double index = 5; List<double> list = new List<double>() { 1, 2, 3, 7, 8, 9, }; double higher=list.OrderBy(q=>q).First(q=>q>index); // 7 double lower=list.OrderByDescending(q=>q).First(q=>q<index); // 3 替换为First()

答案 2 :(得分:0)

一种解决方案是对列表进行排序,然后对其进行迭代以找到list [i]&lt;指数&lt;列表[I + 1]。这需要O(n * log(n))时间。

更好的解决方案是简单地遍历列表并使用相应更新的2个变量(让我们说maxmin)。

max将存储低于索引的最大值。

min将存储高于索引的最小值。

最后一个解决方案需要O(n)时间。

答案 3 :(得分:0)

如果你想要所有的出现

double index = 5;
List<double> list = new List<double>() { 1, 2, 3, 7, 8, 9, };
for(int i =1 ; i <= 9-5 ; i++)
{
    List<double> NextHigh = list.Where(x=> x-i == index).ToList();
    if(! (NextHigh.Count == 0))
    {
        NextHigh.Dump();
        break;
    }
}

for(int i =1 ; i <= 5-1 ; i++)
{
    List<double> NextLow = list.Where(x=> x+i == index).ToList();
    if( !(NextLow.Count== 0))
    {
        NextLow.Dump();
        break;
    }
}

答案 4 :(得分:0)

如果您要使用大量值列表,则给出的另一个答案并不是很好,因为它需要将列表索引两次。

如果您按照以下方式制作自己的循环:

double higher = Double::MaxValue;
double lower = Double::MinValue;

double index = 5; // the value you want to get.
List<double> list = {1,2,3,7,8,9}; // the list you're searching.

for(int i = 0; i < list.Count; i++) 
{
    if(list[i] > index && list[i] < higher)
        higher = list[i]; // sets the higher value.
    else if(list[i] < index && list[i] > lower)
        lower = list[i]; // sets the lower value.
}

执行后,这将为您提供3和7,正确的值。

我应该注意这需要O(n)时间,因为它只循环一次。这将比编辑时发布的任何内容更快(加上它很容易看出它在做什么)。

答案 5 :(得分:-1)

你可以通过这种方式实现这一目标。以下这些代码是在我身边进行测试的。

    double index = 5;
    double higher = 0 ;
    double lower = 0;

    List<double> list = new List<double>() { 1, 2, 3, 7, 8, 9, };
    list.Sort();//Sort list from low to high numbers

    if(!list.Contains(index))
    {
      foreach (var item in list)
      {
         if(item < index)
         {
            lower = item;                      
         }
         if (item > index)
         {
             higher = item;  
             break;  
         }
       }
     }
Console.WriteLine(index);//5
Console.WriteLine(lower);//3
Console.WriteLine(higher);//7