2009-12-03 31 views
3

更換空從列表C#LINQ有意義的字符串

class Delivery 
{ 
    public string ProductCode 
    { 
     get; 
     set; 
    } 

    public DateTime? OrderedDate 
    { 
     get; 
     set; 
    } 

    public DateTime? DeliveryDate 
    { 
     get; 
     set; 
    } 

    public Delivery(string pcode, DateTime? orddate, DateTime? deldate) 
    { 
     ProductCode = pcode; 
     OrderedDate = orddate; 
     DeliveryDate = deldate; 
    } 
} 


List<Delivery> DeliveryList = new List<Delivery>(); 
DeliveryList.Add(new Delivery("P001",new DateTime(2009,01,27),null)); 
DeliveryList.Add(new Delivery("P007",new DateTime(2009,05,17),null)); 
DeliveryList.Add(new Delivery("P031", new DateTime(2008, 03, 15), 
new DateTime(2008,04 ,22))); 
DeliveryList.Add(new Delivery("P011",new DateTime(2009,01,27), 
new DateTime(2009,02,12))); 
DeliveryList.Add(new Delivery("P041",new DateTime(2009,01,27),null)); 
DeliveryList.Add(new Delivery("P051", new DateTime(2009, 01, 27), 
new DateTime(2009, 02, 12))); 
DeliveryList.Add(new Delivery("P501",new DateTime(2009,01,27),null)); 
DeliveryList.Add(new Delivery("P801",new DateTime(2009,01,27),null)); 

var query = DeliveryList.OrderBy(p => p.DeliveryDate); 

對於報告的目的,在LINQ執行,什麼是 消息來代替空值(基於交貨日期)的方式「尚未交付「(DateTime是值類型)。

回答

7
var result = DeliveryList.Select(x => new 
{ 
    ProductCode = x.ProductCode, 
    OrderedDate = x.OrderedDate, 
    DeliveryDate = x.DeliveryDate.HasValue 
     ? x.DeliveryDate.Value.ToString() : "Yet to be delivered" 
}).OrderBy(p => p.DeliveryDate).ToArray(); 
+1

@Darin沒有ToArray()也代碼爲我工作,是否有必要包括ToArray()? – user215675 2009-12-03 07:35:32

+0

ToArray非常重要。沒有它,結果將是每次嘗試使用它時重新執行的查詢。這可能會導致巨大的性能損失,具體取決於您如何使用它。 – 2009-12-03 07:42:28

3

我不是100%確定你的要求,但它聽起來像你想將DeliverList轉換成指示它們何時交付的字符串集合。儘管您希望字符串「尚未交付」,但爲空DeliveryDate。如果是這樣,嘗試以下。

var dates = DeliveryList 
    .Select(x => x.DeliverDate 
    ? x.DeliverDate.Value.ToString 
    : "Yet to be delivered"); 
+0

Jared:謂詞x.DeliverDate是否返回true,如果不爲null?如果是這樣,酷,這是很少「!=空」鍵入!謝謝! – 2009-12-03 07:29:47

+0

感謝JaredPar和Darin – user215675 2009-12-03 07:33:54

0

Darin的解決方案是整潔,我會去用它。作爲替代考慮因素......

如果您想保留上述解決方案的類型,則會創建一個匿名類型,並且交付日期最終可能會以字符串結尾。

List<Delivery> query = (from d in DeliveryList 
         select new Delivery 
         (
           d.ProductCode, 
           d.OrderedDate, 
           d.DeliveryDate ?? DateTime.Now 
         )).OrderBy(p=>p.DeliveryDate).ToList(); 

如果您在交貨類有一個空的構造函數,你可以做類似

List<Delivery> query2 = (from d in DeliveryList 
         select new Delivery 
         { 
          DeliveryDate = d.DeliveryDate ?? DateTime.Now, 
          OrderedDate = d.OrderedDate, 
          ProductCode = d.ProductCode 
          }).OrderBy(p=>p.DeliveryDate).ToList(); 

有一件事你必須做的話,就是有你DeliveryDate一個meaninful更換,如果是空值。我不認爲DateTime.Now會有用,現在你會被卡住DateTime字段。顯然,優勢在於你坐在一個強力施展的List對象上。如果後來你確實會把邏輯放到你的構造器中,那麼我猜可以幫助你。