2009-12-21 5 views
1

J'ai 2 classes et dans la Persons classe que je veux ajouter la capacité de boucle à travers les propriétés du nom de la collection de personne utilisant une boucle foreach, comme ceci:La mise en œuvre question IEnumerable

foreach (string name in Persons.Names) 
{ 
// do something 
} 

Comment pourrais-je faire ce?

Ce sont mes classes:

class Person 
    { 
     public string Name 
     { 
      get; 
      set; 
     } 

     public string Surname 
     { 
      get; 
      set; 
     } 
    } 

    class Persons : IEnumerable<Person> 
    { 
     List<Person> persons = new List<Person>(); 
     public IEnumerator<Person> GetEnumerator() 
     { 
      foreach (Person p in persons) 
      { 
       yield return p; 
      } 
     } 

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

     public IEnumerator<string> Names 
     { 
      // implement looping through Name property of Person class 
     } 

     public Persons() 
     { 

     } 

     public void Add(Person p) 
     { 
      persons.Add(p); 
     } 

     public string this[int index] 
     { 
      get { return this[index]; } 
     } 
    } 

Répondre

7

La première boucle peut être mis en œuvre quelque chose comme ceci:

foreach (Person p in Persons) 
{ 
// do something with p.Name 
} 

Vous pouvez mettre en œuvre quelque chose de bien comme:

public IEnumerator<string> Names 
{ 
    get 
    { 
     foreach (Person p in persons) 
     { 
      yield return p.Name; 
     } 
    } 
} 

ou LINQ:

public IEnumerator<string> Names 
{ 
    get 
    { 
     return persons.Select(p => p.Name); 
    } 
} 
+1

Il devrait y avoir un accesseur serré là-dedans get et – Oskar

+0

... +1 pour l'exhaustivité –

+0

Votre LINQ semble confondre avec IEnumerable IEnumerator . – Mark

2

Est-ce un travail?

foreach (Person p in persons) 
{ 
    yield return p.Name; 
} 

Vive Matthias

5
public IEnumerable<string> Names 
    { 
     get 
     { 
      foreach (Person p in persons) 
      { 
       yield return p.Name; 
      } 
     } 
    } 
1

Jetez un oeil à cet article here et here qui serait utile à votre question et de la situation.