Como obter um objeto personalizado de uma lista genérica com LINQ?
-
03-07-2019 - |
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; }
}
}
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