查找自定义类型列表的最大计数
我有一个模拟应用程序,其中包括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属性是最大的)。 我目前有两个问题。
-
正如您在下面的代码中看到的,我必须手动将每个Manager添加到List变量中。 这不是一个长期的解决方案。 解决这个问题的有效,简洁的方式是什么?
-
我的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让调用者知道谁传递了空列表?