2015-07-26 5 views
0

, который во втором списке пытается создать отношения, однако, если он не соответствует совпадению, как игнорировать и не добавлять элемент?C# Linq List - handle null

var clientData = File.ReadAllLines(txtClients.Text) 
        .Skip(1) 
        .Select(x => x.Split(',')) 
        .Select(x => new Client() 
        { 
         ClientTempId = x[0], 
         Email = x[1], 
         FirstName = x[2], 
         LastName = x[3], 
         AccountId = accountId 
        }); 

var orderData = File.ReadAllLines(txtOrders.Text) 
        .Skip(1) 
        .Select(x => x.Split(',')) 
        .Select(x => new Order() 
        { 
         OrderTempId = x[0], 
        ClientId = clientData.FirstOrDefault(c=>c.ClientTempId == x[1]).Id ==string.Empty?"Error here!!":x[1], 
        //How do I handle errors, if client does not exist, or row is in wrong format? dont want to break code just want a list or issues 
         Name = x[3], 
         AccountId = accountId 
        }); 
+0

Вместо того, чтобы весь поиск по 'список clientData' , поместите его в словарь. – EZI

ответ

0

Вы можете вернуть null вместо, а затем отфильтровать те из:

var orderData = File.ReadAllLines(txtOrders.Text) 
    .Skip(1) 
    .Select(x => x.Split(',')) 
    .Select(x => 
    { 
     // do your check here, and return null 
     if (clientData.FirstOrDefault(c => c.ClientTempId == x[1]) == null) 
      return null; 

     // otherwise return the normal Order object 
     return new Order() 
     { 
      OrderTempId = x[0], 
      ClientId = x[1], 
      Name = x[3], 
      AccountId = accountId 
     }; 
    }) 
    // then filter out null values 
    .Where(x => x != null); 

После того, что охватывается как EZI отметил в комментариях, фактическая проверка довольно дорого. Вы можете сделать его более эффективным, превратив clientData в словарь:

var clientDataDictionary = clientData.ToDictionary(c => c.ClientTempId); 

Затем вы можете сделать поиск выше постоянная время:

if (clientDataDictionary.ContainsKey(x[1])) 
    return null; 
+0

'if (clientData.FirstOrDefault (c => c.ClientTempId == x [1]) == null)' сделает ваш алгоритм 'O (n * n)'. Использование словаря или HashSet было бы лучше. – EZI

+0

@ EZI Хорошее предложение, добавленное кое-что об этом к моему ответу. Благодаря! – poke

 Смежные вопросы

  • Нет связанных вопросов^_^