You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:30:55