序号与精度问题:如何用foreach为列表元素生成子序号
解决子序号生成错误并改用foreach循环处理List
嘿,我来帮你搞定这两个问题:首先修正子序号的生成逻辑,然后把循环改成foreach来处理你的父序号List。
1. 为什么你的代码输出不对?
你现在的代码里,Convert.ToDecimal(i)是把整数i直接转成decimal,然后加到15上,结果自然是15+0=15、15+1=16... 要得到15.1、15.2这种带小数的子序号,得把i转换成0.1、0.2这样的小数步长才行。
而且要注意用10m(decimal后缀)来做除法,避免浮点精度问题。另外,如果你想要从15.1开始而不是15.0,得把i从1开始计数(或者用i+1来偏移)。
修正后的基础代码:
using System; public class Program { public static void Main() { decimal sequenceNumber = 15; for (int i = 0; i < 10 ; i++) { // 用(i+1)让子序号从0.1开始,除以10m保证decimal精度 decimal output = sequenceNumber + (i + 1) / 10m; Console.WriteLine(output); } } }
运行这段代码就会输出15.1、15.2...15.10(如果只需要到15.9,把循环条件改成i < 9就行)。
2. 改用foreach处理父序号List
假设你的父序号存在一个List<int>里,我们可以先定义这个集合,然后用foreach遍历每个父序号,再为每个父序号生成对应的子序号。这里有两种写法,看你需求:
写法1:foreach遍历父序号 + 内部for生成子序号
这种写法适合子序号数量固定的场景:
using System; using System.Collections.Generic; public class Program { public static void Main() { // 定义你的父序号集合 List<int> parentSequenceNumbers = new List<int> {15,16,17,18,19,20,21,22,23,24}; // 遍历每个父序号 foreach (int parentNum in parentSequenceNumbers) { Console.WriteLine($"=== 父序号 {parentNum} 的子序号 ==="); // 生成10个子序号(从x.1到x.10) for (int i = 0; i < 10; i++) { decimal childNum = parentNum + (i + 1) / 10m; Console.WriteLine(childNum); } } } }
写法2:完全用foreach循环(预定义子序号偏移量)
如果你想彻底不用for循环,可以预定义子序号的小数偏移集合,然后嵌套foreach:
using System; using System.Collections.Generic; public class Program { public static void Main() { List<int> parentSequenceNumbers = new List<int> {15,16,17,18,19,20,21,22,23,24}; // 预定义子序号的小数偏移量 List<decimal> childOffsets = new List<decimal> { 0.1m, 0.2m, 0.3m, 0.4m, 0.5m, 0.6m, 0.7m, 0.8m, 0.9m, 1.0m }; foreach (int parentNum in parentSequenceNumbers) { Console.WriteLine($"=== 父序号 {parentNum} 的子序号 ==="); foreach (decimal offset in childOffsets) { decimal childNum = parentNum + offset; Console.WriteLine(childNum); } } } }
这样就完全用foreach处理所有循环了,输出结果和之前一致。
内容的提问来源于stack exchange,提问作者dotnetdevcsharp
相关产品推荐
相关产品推荐

