我有一个数字列表,如果我要查找的数字不在列表中,我希望能够找到上面列表中的下一个值,而不是我要求的数字。< / 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。
答案 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个变量(让我们说max
和min
)。
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