【问题标题】:C# Convert List<string> to List<TimeSpan>C# 将 List<string> 转换为 List<TimeSpan>
【发布时间】:2018-05-24 19:28:41
【问题描述】:

我已经看到了如何将string 转换为TimeSpan 的示例,这里是一个示例:

How to Convert string "07:35" (HH:MM) to TimeSpan

但是将List&lt;string&gt; 转换为List&lt;TimeSpan&gt;最有效方法是什么?

我已经尝试了一些类似的方法,但没有奏效:

var result = new TimeSpan;

var appointmentStartTimesConverted = appointmentStartTimes
  .Select(i => result = TimeSpan.TryParse(i, out result))
  .ToList();

【问题讨论】:

  • TryParse 返回一个布尔值。我认为使用{ result=xx; return result;}
  • 不要使用 LINQ。
  • @M.kazemAkhgary 近距离投票你的答案,因为基于意见^^
  • TryParse 返回布尔值。您不能在 TimeSpan 中添加布尔值。通过这样做result = TimeSpan.TryParse(i,out result)
  • 我认为它不应该被关闭。它不是基于意见的。

标签: c# list timespan


【解决方案1】:

应该做的工作:

 var appointmentStartTimes = new List<string>{"7:45", "0:0","a"};

 var appointmentStartTimesConverted = appointmentStartTimes
   .Select(i =>
            {
                TimeSpan result;
                if(TimeSpan.TryParse(i, out result))
                    return new Nullable<TimeSpan>(result);          
                return null;        
            })
   .Where(x => x.HasValue)
   .ToList();

【讨论】:

  • @M.kazemAkhgary 好点.. 但是 TryParse 不返回可空值.. 无论如何都已修复
  • x!=default(TimeSpan) 条件可能是危险的。如果我们有"0:0" 字符串要转换怎么办?
  • @DmitryBychenko 第三次魅力?
  • x=&gt;x.HasValue 还可以,没有副作用:)
  • 要实际获得TimeStamp 而不是TimeStamp?,请将.Where(x =&gt; x.HasValue) 替换为.OfType&lt;TimeSpan&gt;()
【解决方案2】:

没有 Linq 解决方案 - 简单的循环 就足够了:

 List<TimeSpan> result = new List<TimeSpan>(appointmentStartTimes.Count);

 foreach (var item in appointmentStartTime)
   if (TimeSpan.TryParse(item, out var span)) // out var - C# 7.0 feature
     result.Add(span);

【讨论】:

  • 这个答案解决了 op 的 最有效 重点。也就是说,括号的双重缺失让我感觉很赤裸。
【解决方案3】:

在下面的代码中,我有一个字符串列表(应该有 Timespan 字符串,但它可以包含任何字符串)

首先我检查条件是否通过TryParse,然后我才将特定字符串转换为Timespan并将其添加到Timespan列表中

List<string> str = new List<string>();
str.Add("07:30");
str.Add("amit");
TimeSpan res = new TimeSpan();
List<TimeSpan> ts = str.Where(x => TimeSpan.TryParse(x, out res) != false).Select(y => res).ToList();

这将处理无效的时间跨度字符串。

【讨论】:

    【解决方案4】:

    TryParse 返回布尔值。在 try/catch 块中使用 Parse 以确保将处理所有值或使用来自 TryParse 的输出参数
    无需声明局部变量result

    var appointmentStartTimes = new List<string>();
    //fill values here 
    
    var appointmentStartTimesConverted = appointmentStartTimes
        .Select(i =>
            {
                try
                {
                    return TimeSpan.Parse(i);
                }
                catch
                {
                    return default(TimeSpan);
                }
            }
        ).ToList();
    
    //anothey way
    appointmentStartTimesConverted = appointmentStartTimes
        .Select(i =>
            {
                if (TimeSpan.TryParse(i, out var result))
                    return result;
    
                return default(TimeSpan);
            }
        ).ToList();
    

    【讨论】:

      【解决方案5】:

      我会使用 Linq 编写一些东西,但使用中间函数,如下所示:

              List<string> lst = new List<string>() { "7:35", "3:45", "0:23" };
      
              Func<string, TimeSpan> GetTS = (str) =>
              {
                  TimeSpan.TryParse(str, out TimeSpan ts);
                  return ts;
              };
      
              var tsLst = lst.Select(r => GetTS(r)).ToList();
      

      【讨论】:

      • 这不好。你得到默认值,你不知道默认值是合法结果还是失败。
      • 是的,你完全正确。起初我以为 TimeSpan TryParse 会在失败的情况下给出一个空值。我数数这不是真的。谢谢,@M.kazemAkhgary
      猜你喜欢
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      相关资源
      最近更新 更多