Aquí es un método simple con un bucle foreach
:¿Hay algún plan para "hacer"/operador Action LINQ?
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;
}
un poco feo. Si hubo algún operador en LINQ que significa "hacer algo" (por ejemplo, realizar una Action
para cada seleccionado en la declaración de LINQ), se vería más bonito, más concisa:
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;
}
Soy consciente de que es subjetivo, y sólo mi opinión. Para un bucle Foreach que tiene una línea que simplemente invoca un método, un operador "do
" tiene sentido, en mi opinión. Pero me pregunto si alguien en MS ha pensado lo mismo. ¿Se planifica dicho operador LINQ en próximos lanzamientos (por ejemplo, junto con el debut en C# 4.0)?
Aquí hay otro ejemplo, con un predicado, donde el operador ficticio do
realmente haría que el código se vea más limpio. Este:
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;
}
frente a esto:
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 tarea es trivial. Estoy más interesado en la "belleza" del código. :) – core