如何使用LINQ从通用List中获取自定义对象?

时间:2009-03-06 09:28:06

标签: linq ienumerable

为什么我在以下代码中收到以下错误?

我想如果我将自定义对象放在其类型的通用List中,那么IEnumerable会被处理掉吗?我还需要对此List做什么才能使用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 个答案:

答案 0 :(得分:2)

您需要添加对Single()的调用 - 否则它会返回客户的序列

同时,这里不需要使用查询表达式。使用点符号会更简单:

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

事实上,你可以使它变得更简单,因为Single()超载了一个谓词:

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

如果没有一个匹配,这是一个错误条件吗?如果没有,您可能希望使用First()而不是Single()

编辑:正如Garry所指出的,如果可能有没有结果,您可能需要SingleOrDefault()FirstOrDefault() - 如果这些结果将返回null没有条目匹配。