我有一个双值列表,我想将变量的值舍入到只有那个数字列表
例:
列表内容为:{12,15,23,94,35,48}
变量的值为17,因此它将舍入为15
如果变量的值小于最小数,则它将四舍五入到它,如果它的值大于最大数,它将四舍五入到它.
列表内容总是根据外部因素而变化,所以我无法强调我想要向上或向下舍入的值.
怎么能在C#中做到?
这是使用LINQ的方法:
var list = new[] { 12, 15, 23, 94, 35, 48 };
var input = 17;
var diffList = from number in list
select new {
number,
difference = Math.Abs(number - input)
};
var result = (from diffItem in diffList
orderby diffItem.difference
select diffItem).First().number;
Run Code Online (Sandbox Code Playgroud)
编辑:重命名一些变量,以便代码不那么混乱......
编辑:
该list变量是一个隐式声明的数组int.第一个LINQ语句diffList定义了一个匿名类型,它具有list(number)中的原始数字以及它与当前值(input)之间的差异.
第二个LINQ语句按result顺序命令匿名类型集合,这是你的"舍入"要求.它接受该列表中的第一项,因为它将具有最小的差异,然后仅选择.number匿名类型的原始项.
假设数组已排序,您可以在数组中执行二进制搜索,将其缩小到给定数字之间的两个数字.
然后,一旦你有这两个数字,你只需四舍五入到最接近的两个数字.
static int RoundToArray(int value, int[] array) {
int min = 0;
if (array[min] >= value) return array[min];
int max = array.Length - 1;
if (array[max] <= value) return array[max];
while (max - min > 1) {
int mid = (max + min) / 2;
if (array[mid] == value) {
return array[mid];
} else if (array[mid] < value) {
min = mid;
} else {
max = mid;
}
}
if (array[max] - value <= value - array[min]) {
return array[max];
} else {
return array[min];
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1454 次 |
| 最近记录: |