Как получить пользовательский объект из общего списка с помощью LINQ? - PullRequest
0 голосов
/ 06 марта 2009

Почему я получаю следующую ошибку в следующем коде?

Я думал, что если я помещу пользовательские объекты в общий список его типа, то об 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; }
    }

}

1 Ответ

2 голосов
/ 06 марта 2009

Вам необходимо добавить вызов к Single() - в противном случае он возвращает последовательность клиентов.

В то же время здесь нет необходимости использовать выражение запроса. Будет проще использовать точечную запись:

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

На самом деле, вы можете сделать это еще проще, потому что есть перегрузка Single() для принятия предиката:

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

Это условие ошибки, если не найдено ни одного совпадения? Если нет, вы можете использовать First() вместо Single().

РЕДАКТИРОВАТЬ: Как указал Гарри, если могут быть нет результаты, которые вы можете захотеть SingleOrDefault() или FirstOrDefault() - оба из вернуть null, если не найдено ни одной записи.

...