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

本文关键字:自定义 类型 列表 查找 | 更新日期: 2023-09-27 18:18:53

我有一个模拟应用程序,其中继承链像Employee,Manager,President等。

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<Employee> employeesManaged = new List<Employee>();
        public List<Employee> EmployeesManaged
        {
            get { return employeesManaged; }
            set { employeesManaged = value; }
        }
    }

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

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

  2. my Linq语法错误

我认为第一个问题是最紧迫的。如果有1000个Employee对象,我如何避免将每个对象添加到列表中?
 public static Manager  GetBestManager(List<Manager> managerList)
        {
            Manager m = managerList.Select(x => x.EmployeesManaged).Max();
        }

My Main method

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<Manager> mList = new List<Manager>();
            mList.Add(m);
            mList.Add(m2);
            Manager.GetBestManager(mList);

使用当前语法,我得到错误'不能隐式地将类型Employee转换为Manager

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

1)这取决于数据来自何处。一个数据库,文件从磁盘,在内存收集。通常List或其他结构是由来源决定的。

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

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

快速但可能更脏的解决方案:

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

看我的回答:我怎样才能让LINQ返回一个给定属性的最大值的对象?

可以在System中使用Aggregate函数。Linq

Aggregate更快,因为它只运行一次集合,然后取最大的集合。OrderBy实际上需要进行冒泡排序,而冒泡排序的成本更高

我想这可能是你想要的:

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

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

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