从C#中的元组列表中查找下一个值



所以我不承认这一点,也许你们中的一些人可以帮助我。

我有一个有两列的清单。正如您在示例中看到的,myList将很短,并且对第一列进行了排序。

private List<(double,double)> myList = new List<(double column1, double column2)> {
(6,80),
(8,107),
(10,134),
(12,160),
(16,214),
(20,267),
(25,334),
(32,427),
(40,534)
};

我需要做的是,给定一个数字,比方说24。从元组列表中搜索下一个最接近的值,并返回正确的元组。因此它应该返回(25334(。

如果目标是21,则期望的结果是(25,334)

我的第一种方法是使用列表,因为我可能在将来添加一些值。但是,如果你知道任何一种结构能更好地适应这种用法,可以自由提出。

提前感谢

如果列表被排序,你可以用找到这个元素

var (x, y) = myList.FirstOrDefault(t => t.Item1 >= 24);

如果没有找到这样的元素,则x将是0,否则为所需值(本例中为x = 25y = 334(。

假设元组列表已排序,则可以使用二进制搜索来查找匹配或跟随目标的项的索引。这具有O(Log(N))的复杂性,因此它非常高效:

using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
static class Program
{
public static void Main()
{
List<(double, double)> myList = new List<(double column1, double column2)> {
(6,80),
(8,107),
(10,134),
(12,160),
(16,214),
(20,267),
(25,334),
(32,427),
(40,534)
};
double target = 24;
int index = myList.BinarySearch(
(target, 0), 
Comparer<(double, double)>.Create(
(lhs, rhs) => lhs.Item1.CompareTo(rhs.Item1)) );
if (index < 0)
index = ~index;
if (index < myList.Count)
Console.WriteLine($"Found at index {index}, value = {myList[index]}");
else
Console.WriteLine("Not found");
}
}
}

在DotNetFiddle 上试用

有一点麻烦的是,如果找不到项,BinarySearch()返回索引的方式。在这种情况下,它将是负的,并且您必须采取逐位方式来不获取下一个值的索引。不要为此责怪我。(

另一个棘手的地方是,您只搜索元组中的第一个项,所以第二个项实际上被忽略了。

最后,如果没有找到该项,则索引将位于列表末尾之外,因此您也必须对此进行说明。

从列表中查找最接近的值:

var result=myList.OrderBy(item => Math.Abs(number - item.Item1)).First();

从列表中查找下一个最接近的值:

var result = myList.First(item => item.Item1-number>=0);

你们中的一个人回答了我的问题,然后删除了帖子。我不是解决方案的作者!

double target = 21;
var closest = myList.MinBy(item => Math.Abs(item.Item1 - target));
double resultValue = closest.Item2;

结果值为334。

这就是我想做的,而且只有一句话。美丽的

谢谢!

最新更新