您好,我正在尝试按指定值从字典中查找最接近的值(需要为 2),但似乎我无法找到工作解决方案。
第一次尝试使用静态范围查找值,但意识到如果值差异高于指定范围,我的代码将返回错误的值,所以我被迫返回“绘图板”
Dictionary<double,double> valueDictionary = new Dictionary<double, double>();
valueDictionary.Add(0,10);
valueDictionary.Add(1, 25);
valueDictionary.Add(2, 35);
valueDictionary.Add(3, 55);
valueDictionary.Add(4, 100);
double valueToFind = 40;
var result = valueDictionary.Values.Where(t => t >= valueToFind - 10 && t <= valueToFind + 10).ToDictionary(t=> t,v=>v);
Debug.WriteLine("Result "+result.Count);
如果我们搜索值 40,那么它必须返回 35 和 55
valueDictionary.Add(2, 35);
valueDictionary.Add(3, 55);
如果我们搜索值 60,那么它必须返回 55 和 100
valueDictionary.Add(3, 55);
valueDictionary.Add(4, 100);
但是如果我们搜索值 55,那么它必须返回索引 id,即 3
感谢您的帮助。
不是最好的解决方案,但它完成了它的工作,只是想知道是否可以在此解决方案上使用 linq
double valueToFind = 40;
MyObject minimum = new MyObject(){Y= 0,X = 0};// define minimum range
MyObject maximum = new MyObject(){Y = 100, X = 100}; //define maximum range
foreach (var child in tempList)//your collection
{
if (child.X <= valueToFind)// try to find lower values from our valueToFind variable
{
if (child.Y >= minimum.X)//if value is higher than our lower value, it means its close to our searching minimum value
{
minimum.Y = child.Y;
minimum.X = child.X;
}
}
else if (child.X >= valueToFind) // try to find higher values from our valueToFind variable
{
if (child.X <= maximum.X) //if value is lower than our higher value, it means its close to our searching maximum value
{
maximum.Y = child.Y;
maximum.X = child.X;
}
}
}
Debug.WriteLine("Found variables");
Debug.WriteLine(minimum.X + " " + minimum.Y);
Debug.WriteLine(maximum.X + " " + maximum.Y);
public class MyObject
{
public double X { get; set; }
public double Y { get; set; }
}
最佳答案
使用List.BinarySearch
,您可以查找匹配值或最接近的值:
var values = new List<double>() { 10, 25, 35, 55, 100 };
var valueToFind = 60.0;
var findIndex = values.BinarySearch(valueToFind);
double lowValue, highValue;
bool found = findIndex >= 0;
if (!found) {
var highIndex = -findIndex - 1;
var lowIndex = Math.Max(highIndex - 1, 0);
highIndex = Math.Min(highIndex, values.Count - 1);
lowValue = values[lowIndex];
highValue = values[highIndex];
}
注意:List
必须经过排序才能使 BinarySearch
正常工作。
关于c# - 从字典中查找闭合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55383232/