2016-10-27 45 views
1

我对C#是全新的。使用SharpDevelop程序。我可以在'for'循环内转换ISO 8601 DateTime值。我确定'记录'的ToList方法可以让我将所有的字符串条目转换为DateTime值,但是我无法到达那里。请帮忙。将日期时间字符串列表转换为DateTime值列表

var myFormat = string.Empty; 
myFormat = "yyyy-MM-ddTHH:mm:ss"; 
var myDateTime = System.DateTime.Now; 
var originTime = new System.DateTime(1970,1,1,0,0,0); 
var mySpan = myDateTime.Subtract(new System.DateTime(1970,1,1,0,0,0)); 
var value = mySpan.TotalSeconds; 

using (var sr = new StreamReader(@"C:\Users\me\Desktop\file.csv")) 
{ 
    var reader = new CsvReader(sr); 
    IEnumerable<DataRecord1> records = reader.GetRecords<DataRecord1>(); 
    foreach (DataRecord1 record in records.Take(5)) 
    { 
     myDateTime = System.DateTime.ParseExact(record.TimeWhen, myFormat, null); 
     mySpan = myDateTime.Subtract(originTime); 
     value = mySpan.TotalSeconds; 
     seconds = (float) myDateTime; 
     Debug.Print("{0}", value); 
    } 
} 
+0

你能解释一下你的问题吗?你的“foreach”声明应该做什么? – RafaelC

+0

当然。我正在通过for循环和string-to-DateTime转换学习C#(读取ISO 8601时间字符串的向量)。这是发布的代码。只是想知道如何使用records.ToList来处理所有的字符串条目,每个字符串的DateTime值。 –

+0

您正在做的不仅仅是将文本转换为日期,而是我不确定问题出在哪里,为什么或什么。 – Plutonix

回答

3

从某种类型A的列表转换为B类型的列表,我建议你使用LinqSelect()方法

using system.Linq; 

IEnumerable<DataRecord1> records = reader.GetRecords<DataRecord1>(); 
List<DateTime> datetimes = records.Select(x => System.DateTime.ParseExact(x.TimeWhen, myFormat, null).ToList(); 
1

您可以使用LINQ做

var l = records 
    .Select(x=>System.DateTime.ParseExact(x.TimeWhen, myFormat, null)) 
    .Select(x=>x.Subtract(originTime)) 
    .Select(x=>mySpan.TotalSeconds) 
    .ToList(); 
0

除了使用linq,你可以使用扩展方法来做到这一点:

public static DateTime ToDateTime(this DataRecord1, format) 
{ 
    return System.DateTime.ParseExact(DataRecord1.TimeWhen, format); 
} 

和他们调用ToDateTime方法:

IEnumerable<DataRecord1> records = reader.GetRecords<DataRecord1>(); 
List<DateTime> datetimes = new List<DateTime>(); 
records.ForEach(x => datetimes.Add(x.ToDateTime()); 
0

从签名您CsvReader将返回一个IEnumerable。您可以将其转换为列表或不是。对于DateTime转换,我会使用TryParse。即:

var originTime = new System.DateTime(1970, 1, 1); 
IEnumerable<DataRecord1> records; 

using (var sr = new StreamReader(@"C:\Users\me\Desktop\file.csv")) 
{ 
    var reader = new CsvReader(sr); 
    records = reader.GetRecords<DataRecord1>(); 
} 

DateTime t; 
var result = from r in records 
      let sWhen = r.TimeWhen 
      let When = DateTime.TryParse(sWhen, out t) ? t : (DateTime?)null 
      let span = When - originTime 
      let Epoch = span.HasValue ? span.Value.TotalSeconds : (double?)null 
      select new 
      { 
       sWhen, 
       When, 
       Epoch 
      }; 

// result.Take(5).ToList() 
相关问题