如何使用LINQ计算列表中指定起止站点间的interval总和?
解决LINQ计算站点间interval总和的问题
核心思路
先定位起止站点在列表中的位置,筛选出两者之间的目标站点,再通过LINQ直接求和它们的interval值即可。
代码实现
首先定义站点类:
public class Station { public int no { get; set; } public int interval { get; set; } public string name { get; set; } }
核心逻辑代码:
// 示例站点列表 List<Station> stations = new List<Station> { new Station { no = 1, interval = 0, name = "name1" }, new Station { no = 2, interval = 1, name = "name2" }, new Station { no = 3, interval = 1, name = "name3" }, new Station { no = 4, interval = 2, name = "name4" }, new Station { no = 5, interval = 0, name = "name5" } }; string startName = "name1"; string endName = "name5"; // 查找起止站点(忽略大小写匹配) var startStation = stations.FirstOrDefault(s => s.name.Equals(startName, StringComparison.OrdinalIgnoreCase)); var endStation = stations.FirstOrDefault(s => s.name.Equals(endName, StringComparison.OrdinalIgnoreCase)); // 处理站点不存在的情况 if (startStation == null || endStation == null) { Console.WriteLine("指定站点不存在"); return; } // 获取站点在列表中的索引 int startIndex = stations.IndexOf(startStation); int endIndex = stations.IndexOf(endStation); // 兼容反向输入的情况,确保起始索引小于结束索引 if (startIndex > endIndex) { (startIndex, endIndex) = (endIndex, startIndex); } // 用LINQ筛选中间站点并求和interval int totalInterval = stations .Skip(startIndex + 1) // 跳过起始站点,从下一个站点开始 .Take(endIndex - startIndex - 1) // 取到结束站点的前一个 .Sum(s => s.interval); Console.WriteLine(totalInterval); // 输出结果:4
为什么GetRange不好用?
List.GetRange需要传入起始索引和元素数量,虽然也能实现,但需要额外计算元素数量,且无法直接链式调用求和。相比之下,LINQ的Skip+Take更直观,能和Sum直接串联,代码可读性更高。
额外注意事项
- 如果起止站点相邻或为同一个站点,求和结果会自动为0,无需额外处理逻辑。
- 用
FirstOrDefault而非First,避免因站点不存在抛出异常,提升代码健壮性。
内容的提问来源于stack exchange,提问作者Junel Carl Chavez
相关产品推荐
相关产品推荐

