Comment extraire un objet personnalisé d'une liste générique avec LINQ?
-
03-07-2019 - |
Question
Pourquoi le message d'erreur suivant apparaît-il dans le code suivant?
Je pensais que si je mettais des objets personnalisés dans une liste générique de ce type, alors IEnumerable serait pris en charge? Que dois-je faire d'autre dans cette liste pour pouvoir utiliser LINQ?
Impossible de convertir implicitement le type 'System.Collections.Generic.IEnumerable
<TestLinq23.Customer>
' vers '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; }
}
}
La solution
Vous devez ajouter un appel à <= > - sinon, il renvoie une séquence de clients.
Dans le même temps, il n’est pas vraiment nécessaire d’utiliser une expression de requête ici. Ce sera plus simple d'utiliser la notation par points:
Customer customerWithLinq = customerSet.Where(c => c.FirstName == "Joe")
.Single();
En fait, vous pouvez simplifier encore les choses, car il existe une surcharge de Single()
prise de prédicat:
Customer customerWithLinq = customerSet.Single(c => c.FirstName == "Joe")
S'agit-il d'une erreur s'il n'y a pas exactement une correspondance? Sinon, vous pouvez utiliser First()
au lieu de SingleOrDefault()
.
EDIT: Comme l'a souligné Garry, s'il peut y avoir pas de résultats, vous voudrez peut-être FirstOrDefault()
ou null
- ces deux éléments renverront <=> si aucune entrée ne correspond.