数值按距离排序后公式调用异常及字符串转double的技术求助
解决按距离排序后数值参与公式计算的问题
看起来你遇到的核心问题是:把排序后的数值列表转成逗号分隔的字符串后,没法直接代入数值计算公式——毕竟公式需要的是double类型的数值,而不是字符串。下面给你具体的解决方案:
问题根源
你之前用String.Join(", ", list)把排序后的List<double>转成了字符串(比如"1.225, 1.22, 1.215..."),这个字符串不能直接和数值做乘法/加法运算。我们需要直接使用排序后的数值列表本身,或者把字符串重新转回数值数组。
方案1:直接使用排序后的List参与计算
这是最简单的方式,排序后的列表已经是按与指定变量距离由近到远排列的,直接按索引取元素或者遍历列表即可:
修改后的完整示例代码
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { double pivot = 1.23; // 示例计算参数,你可以替换成自己的实际值 double cma = 1.25; double lowPrice = 1.20; List<double> numbers = ConstructList(); numbers.ToConsole<double>("Unsorted"); // 按与pivot的距离由近到远排序 numbers.Sort(Comparer<double>.Create((x, y) => Math.Abs(pivot - x) < Math.Abs(pivot - y) ? -1 : Math.Abs(pivot - x) > Math.Abs(pivot - y) ? 1 : 0)); numbers.ToConsole<double>("Sorted"); // 直接使用排序后的数值计算nearclose Console.WriteLine("\n计算每个排序后数值对应的nearclose:"); // 取最近的第一个数值 double nearestNearclose = ((cma - lowPrice) * numbers[0]) + lowPrice; Console.WriteLine($"最近数值 {numbers[0]} 的计算结果:{nearestNearclose:F4}"); // 遍历所有排序后的数值依次计算 foreach(var num in numbers) { double currentNearclose = ((cma - lowPrice) * num) + lowPrice; Console.WriteLine($"数值 {num} 的计算结果:{currentNearclose:F4}"); } Console.WriteLine("\nDone."); Console.ReadLine(); } private static List<double> ConstructList() { List<double> result = new List<double>(); result.Add(1.22); result.Add(1.26); result.Add(1.33); result.Add(1.21); result.Add(1.215); result.Add(1.225); return result; } } // 用来简化列表输出的扩展方法 public static class ListExtensions { public static void ToConsole<T>(this List<T> list, string title) { Console.WriteLine($"{title} list:"); Console.WriteLine(String.Join(", ", list)); } }
方案2:如果必须处理字符串格式的数值
如果你因为某些场景已经把列表转成了字符串,需要把它转回double数组再计算:
// 假设你已经得到了排序后的字符串 string sortedString = String.Join(", ", numbers); // 分割字符串并转回double数组 double[] sortedNumbers = sortedString.Split(new[] {", "}, StringSplitOptions.RemoveEmptyEntries) .Select(s => double.Parse(s)) .ToArray(); // 之后就可以用这个数组参与计算了 double nearclose = ((cma - lowPrice) * sortedNumbers[0]) + lowPrice;
关键总结
- 优先直接使用
List<double>或double[]类型的集合参与数值计算,避免不必要的字符串转换 - 如果必须处理字符串,一定要用
double.Parse(或更安全的double.TryParse)把每个字符串元素转回数值类型
内容的提问来源于stack exchange,提问作者FrankDuc
相关产品推荐
相关产品推荐

