我有一个DataTable
(从EXCEL加载),带有日期列。
我需要验证日期列是否有效,如果没有,则返回无效日期的数量。
例如:
Col1 ColDate
---------------
k1 21/11/2016
k2 25/10/1975
k3 31/2/2016
k4 abcd
上表应返回2(导致最后两行包含无效日期)。
如何使用LINQ找到无效行
答案 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"]);
}