0

私は簡単なクラスを持っています

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

        public Employee() 
        { 
        }

        public static Employee GetNewestEmployee(List<Employee> e)
        {
            Employee emp = e.OrderByDescending(x => x.HireDate).FirstOrDefault();
            Console.WriteLine("The newest employee was hired on {0}",emp.HireDate);
            return emp;
        }

このメソッドは、最近雇用された従業員を返します。私のメインメソッドには次のようなものがあります

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;
            e2.HireDate = DateTime.Now.Subtract(TimeSpan.FromDays(100));

            Employee e3 = new Employee();
            e3.EmployeeId = 103;
            e3.HireDate = DateTime.Now.Subtract(TimeSpan.FromDays(1000));
            List<Employee> empList = new List<Employee>();
            empList.Add(e);
            empList.Add(e2);
            empList.Add(e3);

            Console.WriteLine(Employee.GetNewestEmployee(empList).EmployeeId);

        }

これらはすべて十分に機能しますが、作成される Employee オブジェクトの数がわからない場合、または作成された従業員オブジェクトが数千個ある場合、どのような解決策があるのだろうかと考えていました。どうすれば次のようなことができますforeach(object o thatHasBeenInstantiated)か?

4

2 に答える 2

1

オブジェクトを作成してEmployeeFactory、その作業を処理することを検討する必要があります。

public class EmployeeFactory
{
    private readonly IList<Employee> empList;

    public EmployeeFactory(IList<Employee> empList)
    {
        // guard clause to protect from null lists
        this.empList = empList;
    }

    public Employee Create(/* optional employee data used to instatiate */)
    {
        var newEmp = new Employee();
        this.empList.Add(newEmp);
        return newEmp;
    }
}

次に、従業員を作成する必要がある場合はいつでもファクトリを使用するだけで、リストが必要な場合は必要な場所にも提供できます

var empList = new List<Employee>();
var empFactory = new EmployeeFactory(empList);

var emp1 = empFactory.Create();
var emp2 = empFactory.Create();
var emp3 = empFactory.Create();

foreach (var emp in empList)
{
    // do stuff w/ each employee
}

従業員リストを作成して を使用することで、オブジェクトEmployeeFactoryを作成するだけのコード、または従業員リストだけを必要とするコードにファクトリを提供できます。Employeeこれにより、コードの再利用中に発生する可能性のある静的参照の問題が回避されます。たとえば、Employeeオブジェクトの静的メンバー内にオブジェクトの静的リストを保持しているEmployeeが、従業員のリストについて心配する必要がない場合、そのリストはアプリケーションが終了するまで増加し続けます。リストを個別に維持することにより、コードを再利用するアプリケーションは、従業員リストを維持する方法を選択できます。

于 2013-06-19T19:20:40.590 に答える
1

通常、従業員エンティティの一部の表現はデータベースに格納され、このようなシナリオではそのストアにクエリを実行します。

インスタンス化された Employee オブジェクトをすべて維持したい場合は、静的リストを維持できます。

public class Employee
{
    private static readonly IList<Employee> _allEmployees = new List<Employee>();

    public Employee()
    {
        // constructor stuff
        _allEmployees.Add(this);
    }
}

このように、従業員をインスタンスのコレクションに追加せずにインスタンス化することは不可能であり、static NewestEmployeeメソッド (またはプロパティ) は_allEmployeesリストを引数として受け取る代わりにリストを参照します。

于 2013-06-19T19:22:23.370 に答える