Oto prosty sposób z foreach
pętli:Wszelkie plany dotyczące operatora "do zrobienia/działania 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;
}
Niby brzydka. Gdyby istniał jakiś operator w LINQ to znaczy, że „coś zrobić” (np wykonać Action
dla każdego wybranego w rachunku LINQ), to będzie wyglądać ładniej, bardziej lakoniczny:
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;
}
Zdaję sobie sprawę, że to subiektywne i tylko moje opinia. W przypadku pętli foreach, która ma jedną linię, która po prostu wywołuje metodę, operacja "do
" ma sens, moim zdaniem. Ale zastanawiam się, czy ktoś w stwardnieniu rozsianym myślał to samo. Czy taki operator LINQ jest planowany w przyszłych wydaniach (np. Obok debiutu C# 4.0)?
Oto kolejny przykład z predykatem, w którym fikcyjny operator do
naprawdę sprawiłby, że kod wyglądałby czystszy. To:
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;
}
vs. to:
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;
}
Zadanie jest banalne. Bardziej interesuje mnie "uroda" kodu. :) – core