Как получить пользовательский объект из общего списка с помощью LINQ?

StackOverflow https://stackoverflow.com/questions/618190

  •  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 - оба они вернут <=>, если не найдено ни одной записи.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top