1

我有一个模拟应用程序,其中有一个继承链等 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. 我的 Linq 语法不正确。

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

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

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

4

4 回答 4

8

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

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

public static Manager GetBestManager(List<Manager> managerList)
{
    Manager m = managerList.OrderByDescending(x => x.EmployeesManaged.Count).First();
    return m;
}
于 2013-06-18T22:39:45.790 回答
4

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

return managerList
       .OrderByDescending(x => x.EmployeesManaged.Count)
       .FirstOrDefault();
于 2013-06-18T22:41:48.790 回答
3

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

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

聚合更快,因为它只在集合中运行一次,然后取最大的。OrderBy 本质上必须做一个成本更高的冒泡排序。

于 2013-06-18T22:44:37.453 回答
1

我认为这可能是你想要的:

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 而不是抛出异常让调用者知道谁传递了一个空列表呢?

于 2013-06-18T23:21:37.013 回答