J'ai une classe de données Étudiant, et j'ai une classe agrégée Étudiants. L'étudiant a deux propriétés de type string: Name et City. Ce que je veux faire, c'est avoir la possibilité de choisir quelle propriété itérer en utilisant le mécanisme foreach.céder itérateur avec réflexion
Le code que j'ai écrit fonctionne et il est également lisible et agréable. Le problème principal est la performance: la ligne dans laquelle j'utilise le mot-clé yield n'est probablement pas très efficace, mais la question est de savoir combien? est-ce dramatique performance hit?
Existe-t-il un meilleur moyen d'obtenir cette fonctionnalité? (ajouté:. Je ne veux pas permettre à quelqu'un de modifier les retour des objets d'étudiants, de sorte que toutes les solutions Linq proposées ne sont pas bonnes ici pour la rendre plus claire, je veux:
propriété itération + intégration mécanisme foreach + classe d'étudiant et la liste des étudiants sont en lecture seule comment puis-je parvenir)
static void Main(string[] args)
{
Students students = new Students();
students.AddStudent(new Student { Age = 20, Name = "Stud1" , City="City1" });
students.AddStudent(new Student { Age = 46, Name = "Stud2" , City="City2"});
students.AddStudent(new Student { Age = 32, Name = "Stud3" , City="City3" });
students.AddStudent(new Student { Age = 34, Name = "Stud4" , City="city4" });
students.PropertyToIterate = eStudentProperty.City;
foreach (string studentCity in students)
{
Console.WriteLine(studentcity);
}
students.PropertyToIterate = eStudentProperty.Name;
foreach (string studentName in students)
{
Console.WriteLine(studentName);
}
}
public class Students :IEnumerable<object>
{
private List<Student> m_Students = new List<Student>();
private eStudentProperty m_PropertyToIterate = eStudentProperty.Name;
public eStudentProperty PropertyToIterate
{
get { return m_PropertyToIterate; }
set { m_PropertyToIterate = value; }
}
public void AddStudent(Student i_Student)
{
m_Students.Add(i_Student);
}
public IEnumerator<object> GetEnumerator()
{
for (int i = 0; i < m_Students.Count; ++i)
{
yield return (object)m_Students[i].GetType().GetProperty(PropertyToIterate.ToString()).GetValue(m_Students[i], null);
}
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
public enum eStudentProperty
{
Name,
Age,
City
}
public class Student
{
public string Name { get; set; }
public string City { get; set; }
public int Age { get; set; }
}
Vous ne pouvez pas lancer cette exception NotImplemented! – leppie
belle apparence?!?! – flq
Est-ce que cela aide? http://stackoverflow.com/questions/359495/how-to-make-ienumerablet-readonly – Odrade