2009-12-03 3 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

+0

ToArray важен. Без него результатом будет запрос, который будет повторно выполняться каждый раз, когда вы попытаетесь его использовать. Это может привести к огромному поражению производительности в зависимости от того, как вы его используете. –

3

Я не уверен на 100%, что вы просите, но похоже, что вы хотите преобразовать DeliverList в коллекцию строк, указывающую, когда они были доставлены. В случае null DeliveryDate, хотя вы хотите, чтобы строка «Еще должна быть доставлена». Если да, попробуйте следующее.

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

Jared: Предикат x.DeliverDate возвращает true, если не null? Если это так, круто, это намного меньше!! = Null! Благодаря! –

+0

Благодаря JaredPar и Darin – user215675

0

решение Дарин является аккуратным, и я бы с ним. В качестве альтернативного рассмотрения ...

Если вы хотите сохранить тип, как с решением выше анонимного типа, и дата доставки, вероятно, окажется в виде строки.

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(); 

одна вещь, которую вы должны сделать то, это есть meaninful замена для вашего DeliveryDate, если это ноль. Я не думаю, что DateTime.Now будет полезен, и теперь вы будете зацикливаться на поле DateTime. Преимущество, очевидно, состоит в том, что вы сидите со объектом List, который сильно отличен. И помогает, я думаю, если позже вы поместите логику в своего контрагента.