Как получить пользовательский объект из общего списка с помощью LINQ?
-
03-07-2019 - |
Вопрос
Почему я получаю следующую ошибку в следующем коде?
Я думал, что если я помещу пользовательские объекты в общий список такого типа, то об IEnumerable позаботятся? Что еще мне нужно сделать с этим списком, чтобы использовать в нем LINQ?
Невозможно неявно преобразовать тип '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; }
}
}
Решение
Вам необходимо добавить вызов в <= > - в противном случае возвращается последовательность клиентов.
В то же время здесь нет необходимости использовать выражение запроса. Будет проще использовать точечную запись:
Customer customerWithLinq = customerSet.Where(c => c.FirstName == "Joe")
.Single();
На самом деле, вы можете сделать это еще проще, потому что существует перегрузка Single()
для принятия предиката:
Customer customerWithLinq = customerSet.Single(c => c.FirstName == "Joe")
Является ли это ошибочным условием, если не найдено ни одного совпадения? Если нет, вы можете использовать First()
вместо SingleOrDefault()
.
РЕДАКТИРОВАТЬ: Как отметил Гарри, если нет результатов, возможно, вы захотите FirstOrDefault()
или null
- оба они вернут <=>, если не найдено ни одной записи.