Pergunta

Por que eu recebo o seguinte erro no código a seguir?

Eu pensei que se eu colocar objetos personalizados em uma lista genérica de seu tipo, em seguida, IEnumerable seria cuidado de? O que mais eu preciso fazer a esta lista para usar LINQ sobre ele?

Não é possível converter implicitamente o tipo 'System.Collections.Generic.IEnumerable<TestLinq23.Customer>' para '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; }
    }

}
Foi útil?

Solução

Você precisa adicionar uma chamada para Single() -. caso contrário, ele está retornando um seqüência de clientes

Ao mesmo tempo, não há nenhuma necessidade real para usar uma expressão de consulta aqui. Vai ser mais simples de usar a notação de ponto:

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

Na verdade, você pode torná-lo ainda mais simples, porque há uma sobrecarga de Single() tomar um predicado:

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

É uma condição de erro se não houver exatamente um jogo? Se não, você pode querer usar First() em vez de Single().

EDIT: Como apontado por Garry, se pode haver não resultados que você pode querer SingleOrDefault() ou FirstOrDefault() -. ambas irão retornar null se nenhuma entrada corresponder

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top