使用LINQ在DataTable中查找无效日期

时间:2017-01-09 09:22:28

标签: c# linq datatable

我有一个DataTable(从EXCEL加载),带有日期列。

我需要验证日期列是否有效,如果没有,则返回无效日期的数量。

例如:

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

k2     25/10/1975

k3     31/2/2016

k4     abcd

上表应返回2(导致最后两行包含无效日期)。

如何使用LINQ找到无效行

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

以下LINQ应该做的工作。如果使用不变文化不适合您,也可以将CultureInfo传递给TryParse方法。

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

答案 2 :(得分: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) ; 
})

答案 3 :(得分:0)

在LINQ条件下使用Date.TryParse。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"]);
    }