2009-03-06 2 views
0

Зачем возникает следующая ошибка в следующем коде?Как получить пользовательский объект из общего списка с LINQ?

Я думал, что если я поместил пользовательские объекты в общий список его типа, то IEnumerable позаботится? Что еще мне нужно сделать с этим списком, чтобы использовать LINQ?

Не может неявно преобразовать тип «System.Collections.Generic.IEnumerable <TestLinq23.Customer>» к «TestLinq23.Customer»

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace TestLinq23 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Customer> customerSet = new List<Customer>(); 
      customerSet.Add(new Customer { ID = 1, FirstName = "Jim", LastName = "Smith" }); 
      customerSet.Add(new Customer { ID = 2, FirstName = "Joe", LastName = "Douglas" }); 
      customerSet.Add(new Customer { ID = 3, FirstName = "Jane", LastName = "Anders" }); 

      Customer customerWithIndex = customerSet[1]; 
      Console.WriteLine("Customer last name gotten with index: {0}", customerWithIndex.LastName); 

      Customer customerWithLinq = from c in customerSet 
          where c.FirstName == "Joe" 
          select c; 
      Console.WriteLine(customerWithLinq.LastName); 

      Console.ReadLine(); 
     } 
    } 

    public class Customer 
    { 
     public int ID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
    } 

} 

ответ

2

Вам нужно добавить вызов Single() - в противном случае это возвращая Последовательность клиентов.

В то же время здесь нет реальной необходимости использовать выражение запроса. Это будет проще использовать точечную нотацию:

Customer customerWithLinq = customerSet.Where(c => c.FirstName == "Joe") 
             .Single(); 

В самом деле, вы можете сделать это еще проще, потому что есть перегрузка Single() взять предикат:

Customer customerWithLinq = customerSet.Single(c => c.FirstName == "Joe") 

Является ли это условие ошибки если не существует одного совпадения? Если нет, вы можете использовать First() вместо Single().

EDIT: Как было отмечено Garry, если не может быть нет результатов вы можете SingleOrDefault() или FirstOrDefault() - оба они вернутся null, если нет записи матча.

+0

Может также понадобиться варианты * OrDefault(), если это действительно так, что запись не существует. –

+0

Да, я добавлю это к ответу. –

+0

Был также забыт перегрузка, берущая предикат - еще проще :) –

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