2010-07-23 59 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); 

我希望它可以幫助別人,因爲這是一箇舊帖子。