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

C#中如何高效将List<string>转换为List<TimeSpan>?

将List转换为List的高效方法

嘿,我来帮你搞定这个问题!首先得指出你现有代码的问题:TimeSpan.TryParse返回的是布尔值(表示转换成功与否),所以你当前的代码会得到一个List<bool>,而不是你想要的List<TimeSpan>——这就是它没法正常运行的原因。

下面分几种场景给你提供高效的解决方案:

1. 假设所有字符串都能成功转换(无异常风险)

如果确定你的appointmentStartTimes里的每一项都是合法的TimeSpan格式,直接用TimeSpan.Parse结合LINQ就足够简洁高效:

var appointmentStartTimesConverted = appointmentStartTimes
    .Select(TimeSpan.Parse)
    .ToList();

这种方式代码量少,可读性高,性能也很棒,适合输入数据完全可信的场景。

2. 需要处理转换失败的情况(稳健型)

如果列表里可能存在格式错误的字符串,就得用TryParse来避免抛出异常。这里有两种常用方式:

方式一:foreach循环(性能略优)

对于性能敏感的场景,foreach的开销比LINQ略小,而且逻辑直观:

var appointmentStartTimesConverted = new List<TimeSpan>();
foreach (var timeStr in appointmentStartTimes)
{
    if (TimeSpan.TryParse(timeStr, out var timeSpan))
    {
        appointmentStartTimesConverted.Add(timeSpan);
    }
    // 可选:这里可以添加转换失败的处理逻辑,比如记录日志
}

方式二:LINQ链式调用(代码更简洁)

如果更喜欢LINQ的风格,可以用可空TimeSpan来过滤掉转换失败的条目:

var appointmentStartTimesConverted = appointmentStartTimes
    .Select(timeStr => TimeSpan.TryParse(timeStr, out var ts) ? (TimeSpan?)ts : null)
    .Where(ts => ts.HasValue)
    .Select(ts => ts.Value)
    .ToList();

这种方式把过滤和转换整合在一起,代码紧凑,可读性也不错。

3. 针对固定格式的字符串(更精准)

如果你要转换的字符串是固定格式(比如你提到的HH:MM),推荐用TryParseExact来指定格式,避免因系统文化差异导致的转换错误,同时提升可靠性:

using System.Globalization;

var targetFormat = @"hh\:mm"; // 匹配HH:MM格式
var appointmentStartTimesConverted = appointmentStartTimes
    .Select(timeStr => TimeSpan.TryParseExact(
        timeStr, 
        targetFormat, 
        CultureInfo.InvariantCulture, 
        out var ts) ? (TimeSpan?)ts : null)
    .Where(ts => ts.HasValue)
    .Select(ts => ts.Value)
    .ToList();

关于“高效性”的补充

其实上面几种方法的性能差异极小:LINQ的额外开销在大多数业务场景下可以忽略不计;如果是超大规模的列表(百万级以上),foreach循环会稍微快一点,但日常开发中,选择最符合你代码风格和需求的方式就好。

内容的提问来源于stack exchange,提问作者the_tr00per

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:03:28