1

継承チェーン Employee,Manager,Presidentなどのモックアプリケーションがあります。

従業員クラスは次のようになります

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 プロパティが最大のマネージャー) を見つけるメソッドを書きたいと思います。現在2つの問題があります。

  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);

現在の構文では、「従業員型をマネージャーに暗黙的に変換できません」というエラーが表示されます

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 関数を使用できます

Aggregate は、コレクションを 1 回実行するだけで最大のものを取得するため、より高速です。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 に答える