2

実行時に設定できる列挙子を使用してコレクションを定義したいと考えています。

列挙子を定義しました:

public class JuniorEmployeeEnumerator : IEnumerable<Employee> {
    List<Employee> list = new List<Employee>();

    public JuniorEmployeeEnumerator(List<Employee> emplist) {
        list = emplist;
    }
    public IEnumerator<Employee> GetEnumerator() {
        for (int i = 0; i < list.Count; i++) {
            if (list[i].Age < 50) {
                yield return list[i];
            }
        }
    }
    IEnumerator IEnumerable.GetEnumerator() {
        return (GetEnumerator());
    }
}

コレクションは列挙子を受け入れます。

public class EmployeeCollection : IEnumerable<Employee> {
    public List<Employee> Employees { get; set; }
    public IEnumerable<Employee> EnumeratorType { get; set; }
    public EmployeeCollection() {
        Employees = new List<Employee>();
    }
    public IEnumerator<Employee> GetEnumerator() {
        return EnumeratorType.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator() {
        return (GetEnumerator());
    }
}

したがって、使用法は次のようになります。

static void Main(string[] args) {
    EmployeeCollection empcoll = new EmployeeCollection();

    empcoll.Employees.Add(new Employee("Fatima", 57));
    empcoll.Employees.Add(new Employee("Evangeline", 52));
    empcoll.Employees.Add(new Employee("Damien", 49));
    empcoll.Employees.Add(new Employee("Cameroon", 55));
    empcoll.Employees.Add(new Employee("Babu", 24));

    Console.Write("Senior Employees \n");

    empcoll.EnumeratorType = new JuniorEmployeeEnumerator(empcoll.Employees);

    foreach (Employee anEmp in empcoll.GetEnumerator()) {
        Console.Write("   " + anEmp.Name + "   " + anEmp.Age + "\n");
    }
    Console.ReadKey();
}

しかし、私はこのコンパイルエラーが発生します:

foreach ステートメントは、'System.Collections.Generic.IEnumerator' に 'GetEnumerator' のパブリック定義が含まれていないため、'System.Collections.Generic.IEnumerator' 型の変数を操作できません。

どうすれば修正できますか?

4

3 に答える 3

3

foreach を使用して、IEnumerator ではなく IEnumerable をループします。

したがって、代わりに

foreach (Employee anEmp in empcoll.GetEnumerator()) {
    Console.Write("   " + anEmp.Name + "   " + anEmp.Age + "\n");
}

あなたがすることができます:

foreach (Employee anEmp in empcoll) {
    Console.Write("   " + anEmp.Name + "   " + anEmp.Age + "\n");
}

基本的に、 foreach キーワードは次の構文糖衣にすぎません。

using (var enumerator = enumerable.GetEnumerator()) {
    T loopVar;
    while (enumerator.MoveNext()) {
        loopVar = enumerator.Current;
        ... loop body ...
    }
}

つまり、LINQ 演算子 (Where() など) は、解決しようとしている問題に対するより良い解決策になる可能性があります。

List<Employee> emps = ...;
foreach (var junior in emps.Where(e => e.Age < 50)) {
   ...
}
于 2013-06-22T17:32:27.633 に答える