首页 > 解决方案 > C#从列表中获取值在一个范围内的索引

问题描述

假设我有List<float>以下值:

{20, 60, 80, 85, 90, 120, 140}

我有一个数字,假设是“75”。我怎样才能找到我拥有的这个数字(75)> = 然后是索引的值和 < 然后是下一个索引的值的索引?简而言之,我想找到我的数字(75)在 60 到 80 之间的“范围内”,所以它返回给我的索引号为 1。

到目前为止,我使用了 Linq,但它只返回最接近的值。我想找到索引。

myList.OrderBy(x => Math.Abs(points - x)).First()

有没有一种有效的方法可以将此索引返回给我?我知道有可能使用 For 循环,但我相信如果我考虑到我可能不得不在几秒钟内调用它几次,那么循环可能会很重。(该列表将包含 ~99 个值)。

非常感谢你!我很感激任何帮助!

标签: c#listlinq

解决方案


我希望我明白你的意思。

以下应该可以帮助你

var list = new List<float>{20, 60, 80, 85, 90, 120, 140};
var numberToSearch = 70;
var result = list.Select((x,index)=> new 
                                     {
                                       Index=index, 
                                       Value=x, 
                                       Diff = Math.Abs(x-numberToSearch)
                                     })
                 .OrderBy(x=>x.Diff)
                 .First()
                 .Index;
Console.WriteLine($"Search Term {numberToSearch}, Index={result}");

或者(如果列表最初是排序的),你也可以这样做

var result = list.Select((x,index)=> new {number=x, index= index}).First(x=> x.number > numberToSearch).index - 1;

if(result == -1)
{
    Console.WriteLine("Not Found");
}
else
    Console.WriteLine($"Search Term {numberToSearch}, Index={result}");
}

输出为numberToSearch = 70

Search Term 70, Index=1

输出为numberToSearch = 87

Search Term 87, Index=3

推荐阅读