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; }
    }

}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top