2016-10-27 17 views
1

Я совершенно новый для C#. Использование программы SharpDevelop. Я могу преобразовать значение DateTime ISO 8601 в цикл 'for'. Я уверен, что метод ToList 'records' позволит мне преобразовать все записи строк в значения 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

Несомненно. Я изучал C# с преобразованием for-loop и string-to-DateTime (чтение в векторе строк времени 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()