2009-03-06 5 views
0

Pourquoi l'erreur suivante apparaît-elle dans le code suivant?Comment extraire un objet personnalisé d'une liste générique avec LINQ?

Je pensais que si je mets des objets personnalisés dans une liste générique de son type alors IEnumerable serait pris en charge? Quoi d'autre dois-je faire à cette liste pour utiliser LINQ dessus?

Impossible de convertir implicitement le type '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; } 
    } 

} 

Répondre

2

Vous devez ajouter un appel à Single() - sinon il est de retour d'un séquence des clients.

En même temps, il n'y a pas vraiment besoin d'utiliser une expression de requête ici. Ce sera plus simple d'utiliser la notation dot:

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

En fait, vous pouvez le rendre encore plus simple, parce qu'il ya une surcharge de Single() prendre un prédicat:

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

Est-ce une condition d'erreur s'il n'y a pas exactement un match? Sinon, vous pouvez utiliser First() au lieu de Single().

EDIT: Comme l'a souligné Garry, s'il peut y avoir aucun résultats que vous pouvez SingleOrDefault() ou FirstOrDefault() - ces deux retourneront null si aucune correspondance entrées.

+0

Peut également nécessiter les variantes * OrDefault() si la validité d'un enregistrement n'existe pas. –

+0

Oui, je vais ajouter cela à la réponse. –

+0

Avait également oublié la surcharge en prenant un prédicat - encore plus simple :) –

Questions connexes