【问题标题】:How to return IList<T> in Lambda query for this program如何在该程序的 Lambda 查询中返回 IList<T>
【发布时间】:2011-11-13 00:49:50
【问题描述】:

我有 Employee 类,它有 3 个属性,ID、Name、HireDate。

var employees = new List<Employee>()
{
    new Employee {Employeeid = 1, EmployeeName = "Ravi", HireDate = new DateTime(2007, 2, 23)},
    new Employee {Employeeid = 2, EmployeeName = "Scott", HireDate = new DateTime(2007, 2, 23)},
    new Employee {Employeeid = 3, EmployeeName = "Megan", HireDate = new DateTime(2003, 9, 2)},
    new Employee {Employeeid = 4, EmployeeName = "Raj", HireDate = new DateTime(2010, 9, 23)},
    new Employee {Employeeid = 5, EmployeeName = "Major", HireDate = new DateTime(2003, 9, 23)},
    new Employee {Employeeid = 6, EmployeeName = "Kernel", HireDate = new DateTime(2011, 12, 3)},
};

现在我需要编写一个返回特定 ID 的 IList 的函数。根据 ID,我需要特定员工信息的所有详细信息。我不知道我在哪里错过了它,它显示了一些关于返回类型的错误。 “无法将 bool 转换为 IList”。请帮帮我。

 private IList<Employee> GetDetails(List<Employee> list, int id)
{
    return list.Select(e => e.Employeeid == id)
}

我将使用此函数让操作委托在控制台上编写。

var query= GetDetails(list, 4); 

对于这个查询,我需要调用打印委托。

Action<Employee> print = e => Console.WriteLine(string.Format("{0} Hired on  {1}",e.EmployeeName,e.HireDate));

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    您应该使用Where,而不是Select,并且需要使用ToList() 来返回IList&lt;Employee&gt;:

    private IList<Employee> GetDetails(List<Employee> list, int id)
    {
        return list.Where(e => e.Employeeid == id).ToList();
    }
    

    对于您的编辑,您可以使用标准的foreach:

    foreach (var employee in GetDetails(employees))
    {
        print(employee);
    }
    

    或者,如果您要从GetDetails() 返回List&lt;Employee&gt;,则可以使用List&lt;T&gt; 上的ForEach() 方法来执行操作:

    private List<Employee> GetDetails(List<Employee> list, int id)
    {
        return list.Where(e => e.Employeeid == id).ToList();
    }
    

    用作:

    GetDetails(employees).ForEach(print);
    

    【讨论】:

    • 返回IEumerable怎么样
    • 如果合适,那么您可以简单地将返回类型更改为 IEnumerable (在这种情况下,您不一定需要 ToList() 因为 Where() 本身返回 IEnumerable)。
    • 是的,它正在工作,但现在我必须将它用于 Action 委托来打印详细信息。我该如何使用它?
    【解决方案2】:

    我相信每个Employee 都有一个唯一的ID,那你为什么要返回一个List 呢? 您的方法将只返回一名员工,因为对于给定 ID,您没有多个 Employee 实例。

    您可以使用 LINQ FirstOrDefault 方法:

    private Employee GetEmployee( IEnumerable<Employee> list, int id )
    {
         return list.FirstOrDefault( e => e.EmployeeId == id);
    }
    

    【讨论】:

    • 如果我需要,如何为这个函数返回 ienumerable
    • 然后,使用 Where 而不是 FirstOrDefault (并更改方法的返回类型)。但是我怀疑在这种情况下您是否需要返回 IEnumerable ;这意味着您的 ID 不是唯一的,这不好。
    • id 将是唯一的,但我需要此详细信息以便 Action 委托写入控制台输出。 likethis Action print = e => Console.WriteLine(string.Format("{0} Hired on {1}",e.EmployeeName,e.HireDate));
    【解决方案3】:

    只需改变这一行

     private IList<Employee> GetDetails(List<Employee> list, int id) 
     { 
         return list.Select(e => e.Employeeid == id) 
     }
    

    到

     private IList<Employee> GetDetails(List<Employee> list, int id) 
     { 
        return list.Where(e => e.Employeeid == id).ToList();
     }
    

    【讨论】:

    • 如果需要,如何返回 ienumerable。
    【解决方案4】:

    对于每个员工,Select 预测 true(如果 EmployeeId 等于 id)或 false (如果EmployeeId 不是)。所以,你最终会得到一个可枚举的布尔值...... 你需要的是Where,就像 Frederik 和 Iridium 说的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      相关资源
      最近更新 更多