2010-07-23 62 views
1

我用下面的代码使用LINQ to负荷XML对象的列表:XML LINQ选择对象 - 使用的TryParse

List<Order> TheList = 
    (from order in XMLResponse.Descendants("Order") 
    select new Order 
    { 
     OrderDate = DateTime.Parse(order.Element("OrderDate").Value) 
    }).ToList<Order>(); 

我想用DateTime.TryParse,这样我可以使用的DBNull值不正确解析的值,所以如果出现错误,我可以继续处理。我试过这个:

OrderDate = DateTime.TryParse(order.Element("OrderDate").value, out OrderDate) 

但是,该代码产生一个无效的参数异常。

我知道我可以使用中间类(所有字符串值)来加载值,但这似乎是我试图完成的过多的代码。有没有办法在我的代码中使用TryParse?由于

+0

我刚刚更正了“select new obj”行 – bvanderhaar 2010-07-23 12:32:15

回答

2

假设这是对XML的格式正确的日期,则可以转换为DateTime?

from order in XMLResponse.Descendants("Order") 
select new obj 
{ 
    OrderDate = (DateTime?) order.Element("OrderDate") 
}).ToList<Order>(); 

这仍然会抛出一个异常,如果该值是坏的,但如果缺少返回空值。

无可否认,我不希望真正编译,因为你没有选择Order ......但你明白我的意思。

下面是其使用TryParse替代:

public static DateTime? TryParseDateTime(string value) 
{ 
    DateTime ret; 
    return DateTime.TryParse(value, out ret) ? ret : (DateTime?) null; 
} 
... 
List<Order> list = from order in XMLResponse.Descendants("Order") 
        select new obj 
        { 
         OrderDate = TryParseDateTime(order.Element("OrderDate").Value) 
        }).ToList<Order>(); 

这基本上给出了TryParse一种替代形式,其使用一个Nullable<DateTime>代替一个单独的布尔标志,以允许它以指示解析故障。

我会强烈顺便说一句,建议您使用TryParseExact与适当的格式字符串和文化。

+0

正是我所需要的,谢谢Jon – bvanderhaar 2010-07-23 13:12:35

+0

我应该提到我必须改变TryParseDateTime方法中的返回行以包含第二个参数 - 如下所示:DateTime.TryParse(value ,退出ret)? ret:(DateTime?)null; – bvanderhaar 2010-07-23 13:26:31

+0

@bvanderhaar:哎呀,是的:)将修复。 – 2010-07-23 13:28:53

1
internal class DateTimeParse 
{ 
    public DateTimeParse(string str) 
    { 
    DateTime dt = DateTime.MinValue; 
    Correct = DateTime.TryParse(str, out dt); 
    if (Correct) Value = dt; 
    } 

    public DateTime Value { get; private set; } 
    public bool Correct { get; private set; } 
} 

var hist = from x in aNodes 
    let dt = new DateTimeParse(x.InnerHtml) 
    where dt.Correct 
    select dt.Value; 
0

的这里的问题是,像DateTime.Tryparse几乎所有TryParse返回一个布尔值。 此处的OUT参数是DateTime(不可为空)。

这就像:

bool myBool = Datetime.TryParse(myString, out myDateTimeNotNullable); 

你也可以用它嵌套在一个验证:

if(Datetime.TryParse(myString, out myDateTimeNotNullable)) 
    { 
     //myDateTimeNotNullable has the valid DateTime from myString 
    } 
    else 
    { 
     //myDateTimeNotNullable has the value set to new DateTime() 
    } 

这就是我会写:

DateTime OrderDate; 
DateTime.TryParse(((XmlNode)order.Element("OrderDate")).InnerText, out OrderDate); 

我希望它可以帮助别人,因为这是一个旧帖子。