查找自定义类型列表的最大计数

我有一个模拟应用程序,其中包括Employee,Manager,President等inheritance链。

Employee类看起来像

 class Employee { public int EmployeeId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime HireDate { get; set; } public Employee() { } } 

和Manager类看起来像

  class Manager : Employee { private List employeesManaged = new List(); public List EmployeesManaged { get { return employeesManaged; } set { employeesManaged = value; } } } 

我想编写一个方法来查找管理大多数员工的经理(其EmployeesManaged.Count属性是最大的)。 我目前有两个问题。

  1. 正如您在下面的代码中看到的,我必须手动将每个Manager添加到List变量中。 这不是一个长期的解决方案。 解决这个问题的有效,简洁的方式是什么?

  2. 我的Linq语法不正确。

我认为第一个问题是最紧迫的。 如果有1000个Employee对象,我将如何避免将每个对象添加到列表中?

  public static Manager GetBestManager(List managerList) { Manager m = managerList.Select(x => x.EmployeesManaged).Max(); } 

我的主要方法

 Employee e = new Employee(); e.EmployeeId = 101; e.FirstName = "Tom"; e.LastName = "Jones"; e.HireDate = DateTime.Now.Subtract(TimeSpan.FromDays(40)); Employee e2 = new Employee(); e2.EmployeeId = 102; Employee e3 = new Employee(); e3.EmployeeId = 103; Manager m = new Manager(); m.EmployeeId = 201; m.EmployeesManaged.Add(e); m.EmployeesManaged.Add(e2); Manager m2 = new Manager(); m2.EmployeesManaged.Add(e3); List mList = new List(); mList.Add(m); mList.Add(m2); Manager.GetBestManager(mList); 

使用当前语法,我收到错误’无法将类型Employee隐式转换为Manager

1)这取决于数据的来源。 内存集合中的数据库,磁盘文件。 List或任何结构通常由源确定。

2)您的LINQ获得最大数量,而不是具有最高计数的Manager 。 尝试:

 public static Manager GetBestManager(List managerList) { Manager m = managerList.OrderByDescending(x => x.EmployeesManaged.Count).First(); return m; } 

有效的快速且可能更脏的解决方案:

 return managerList .OrderByDescending(x => x.EmployeesManaged.Count) .FirstOrDefault(); 

在这篇文章中看到我的答案: 如何让LINQ返回具有给定属性的最大值的对象?

您可以在System.Linq中使用Aggregate函数

聚合速度更快,因为它只是在集合中运行一次,并且随着时间的推移占据最大值。 OrderBy基本上必须进行更高成本的冒泡排序。

我想这可能是你想要的:

 public static Manager GetBestManager(this IList managerList) { Func getCount=x => x.EmployeesManaged.Count; return managerList.First(x => getCount(x)==managerList.Max(getCount)); } 

如果有多个经理拥有相同的员工数,则返回第一个。 不使用FirstOrDefault的原因是因为从列表中获取最大值,我们总能找到一个管理器匹配最大值,除了集合为空。

那么,为什么使用FirstOrDefault返回null而不是抛出exception让调用者知道谁传递了空列表?