Voici une méthode simple avec une boucle foreach
:Des plans pour "faire"/Action LINQ opérateur?
IEnumerable<XElement> FieldsToXElements(object instance)
{
var fieldElements = new List<XElement>();
foreach (var field in instance.GetType().GetFields(instance))
{
fieldElements.Add(new XElement(field.Name, field.GetValue(instance)));
}
return fieldElements;
}
Type de laid. S'il y avait un certain opérateur LINQ que signifie « faire quelque chose » (par exemple, effectuer une Action
pour chaque sélectionné dans la déclaration LINQ), il semble plus agréable, plus laconique:
IEnumerable<XElement> FieldsToXElements(object instance)
{
var fieldElements = new List<XElement>();
from field in instance.GetType().GetFields(instance))
let name = field.Name
let value = field.GetValue(instance)
do fieldElements.Add(new XElement(name, value));
return fieldElements;
}
Je me rends compte que ce subjectif, et que mon opinion. Pour une boucle foreach qui a une ligne qui invoque simplement une méthode, un opérateur "do
" a du sens, à mon avis. Mais je me demande si quelqu'un à MS a pensé la même chose. Un tel opérateur LINQ est-il prévu dans les prochaines versions (par exemple, à l'occasion du lancement de C# 4.0)?
Voici un autre exemple, avec un prédicat, où l'opérateur fictif do
rendrait le code plus net. Ce:
IEnumerable<XElement> FieldsToXElements
(object instance, Func<FieldInfo, bool> predicate)
{
var fieldElements = new List<XElement>();
foreach (var field in instance.GetType().GetFields(instance).Where(predicate))
{
fieldElements.Add(new XElement(field.Name, field.GetValue(instance)));
}
return fieldElements;
}
par rapport à ceci:
IEnumerable<XElement> FieldsToXElements
(object instance, Func<FieldInfo, bool> predicate)
{
var fieldElements = new List<XElement>();
from field in instance.GetType().GetFields(instance))
let name = field.Name
let value = field.GetValue(instance)
where predicate(field)
do fieldElements.Add(new XElement(name, value));
return fieldElements;
}
La tâche est triviale. Je suis plus intéressé par la "joliesse" du code. :) – core