Wie ein benutzerdefiniertes Objekt aus einer generischen Liste mit LINQ zu bekommen?
-
03-07-2019 - |
Frage
Warum erhalte ich folgende Fehlermeldung in dem folgenden Code?
Ich dachte, wenn ich benutzerdefinierte Objekte in einer generischen Liste seiner Art setzte dann würde IEnumerable betreut werden? Was brauche ich, um auf diese Liste zu tun LINQ zu verwenden, um auf das?
Kann nicht implizit Typ umwandeln 'System.Collections.Generic.IEnumerable
<TestLinq23.Customer>
' zu '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; }
}
}
Lösung
Sie müssen einen Aufruf in den Single()
-. sonst ist es eine Rückkehr sequence von Kunden
Zur gleichen Zeit gibt es keine wirkliche Notwendigkeit hier einen Abfrage-Ausdruck zu verwenden. Es wird einfacher sein Punktnotation zu verwenden:
Customer customerWithLinq = customerSet.Where(c => c.FirstName == "Joe")
.Single();
In der Tat, können Sie es sogar noch einfacher, weil es eine Überlastung von Single()
ein Prädikat zu nehmen:
Customer customerWithLinq = customerSet.Single(c => c.FirstName == "Joe")
Ist es ein Fehler, wenn es nicht gerade ein Spiel ist? Wenn nicht, sollten Sie First()
statt Single()
.
EDIT: Wie von Garry wies darauf hin, wenn es sein kann, nicht führt Sie vielleicht SingleOrDefault()
oder FirstOrDefault()
-. beides wird wieder null
wenn keine Einträge übereinstimmen