2017-01-09 2 views
-1

У меня есть DataTable (который был загружен из EXCEL) столбцом Date.Поиск неверных дат в DataTable с использованием LINQ

Мне нужно проверить, что столбец даты действителен и если не вернуть число недопустимых дат.

Например:

Col1 ColDate 
--------------- 
k1  21/11/2016 

k2  25/10/1975 

k3  31/2/2016 

k4  abcd 

В приведенной выше таблице должны вернуть 2 (вызвать последние две строки содержат недопустимые даты).

Как я могу найти недопустимые строки с помощью LINQ

+1

Вы могли бы перебрать пытаться делать дату разбора, чтобы увидеть, если это позволяет вам – BugFinder

+0

я попробовал его с помощью LINQ, и в приведенном выше примере, все записи возвращаются как NOT дата – Nir

+0

Ну, первый пост кода, который делая это без использования LINQ, тогда попросите перевод LINQ, если вы все еще не можете сделать это самостоятельно. –

ответ

2

Я надеюсь, что этот код поможет вам.

string[] dates = { "10-10-2015", "41-50-5880", "awewe" }; 

     foreach (var Date in dates) 
     { 
      try 
      { 
       Console.WriteLine(DateTime.Parse(Date)); 
      } 
      catch (FormatException ex) 
      { 
       Console.WriteLine("Invaid Date"); 
      } 
     } 

Выход

10/10/2015 12:00:00 AM 
Invaid Date 
Invaid Date 

Использование Linq

var Dates = (from dd in dates      
       select WE(dd)).ToList(); 

Добавить функцию

public static string WE(string Date) 
    { 
     try 
     { 
      return DateTime.Parse(Date).ToString(); 
     } 
     catch (FormatException ex) 
     { 
      return "Invalid Date"; 
     } 
    } 

Выход

10/10/2015 12:00:00 AM 
Invaid Date 
Invaid Date 
+0

Спасибо, я ищу способ сделать это, используя LINQ – Nir

1

После LINQ должен делать свою работу. Вы также можете передать метод CultureInfo в TryParse, если использование инвариантной культуры вам не подходит.

DateTime date; 
var itemsWithInvalidDates = items.Where(item => !DateTime.TryParse(item.ColDate, out date)) 
           .ToList(); 
1

Если вы действительно уверены, что все ваши даты имеют этот формат, попробовать это (код предполагает, что у вас есть ваши данные в виде коллекции строк):

string[] dates = { "21/11/2016", "25/10/1975", "31/2/2016", "asdad" }; 
var result = dates.Count(x => 
{ 
    DateTime val; 
    return DateTime.TryParseExact(x, "dd/MM/yyyy", 
      CultureInfo.InvariantCulture, DateTimeStyles.None, out val); 
}) 

если 31/2/2016 не действует дата, но 01/2/2016 действительно, вы должны обновить запрос:

dates.Count(x => 
{ 
    DateTime val; 
    return DateTime.TryParseExact(x, "dd/MM/yyyy",    
         CultureInfo.InvariantCulture, DateTimeStyles.None, out val) 
    || DateTime.TryParseExact(x, "dd/M/yyyy", 
         CultureInfo.InvariantCulture, DateTimeStyles.None, out val) ; 
}) 
0

Использование Date.TryParse в состоянии LINQ. Example with code

 public static void Main(string[] args) 
     { 
     //Your code goes here 
     DataTable datatable = GetDataTable(); 
     DateTime date ; 
     var dataRows = datatable.AsEnumerable().Where(myRow => DateTime.TryParse(myRow.Field<String>("ColDate"), out date)); 

     foreach (DataRow row in dataRows) 
     Console.WriteLine(row["ColDate"]); 
    } 
Смежные вопросы