题
下面是一个简单的方法用foreach
循环:
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;
}
的难看类。如果有一些经营者在LINQ意味着“做什么”(例如,要对每个在LINQ语句中选择一个Action
),它会看起来更好,更简洁:
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;
}
我知道这是主观的,只是我的意见。对于foreach循环有一行简单地调用一个方法,一个“do
”运营商是有道理的,在我看来。 但是我如果有人在MS一直认为同样的事情不知道。被这样操作者LINQ计划在任何即将发布的版本(例如,沿着C#4.0登场)吗
下面是另外一个例子,有一个谓语,其中虚构do
运营商将真正使代码看起来更干净。这样:
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。这样:
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;
}
解决方案
没有,我不希望任何直接的语言询问服务(即查询语法内)任何时间很快。
这听起来像你指的是神话ForEach
扩展方法;容易加入,但埃里克利珀评论了无数次关于自由副作用功能代码和Action<T>
与副作用之间的交叉。特别地,C#3.0 / NET 3.5表达式树是在侧effecs(充分拉姆达支持棘手)糟糕。运行时侧是在.NET 4.0中好多了,但目前还不清楚目前其中有多少会使其进入语言(拉姆达编译)在C#4.0。
你所需要的(用于委托版本)是:
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{ // note: omitted arg/null checks
foreach(T item in source) { action(item); }
}
然后,从任何查询可以简单地使用.ForEach(x => /* do something */)
。
其他提示
有关您的具体实例(填充一个List<XElement>
),我会做这种方式。
IEnumerable<XElement> FieldsToXElements(object instance)
{
List<XElement> fieldElements =
(
from field in instance.GetType().GetFields(instance))
let name = field.Name
let value = field.GetValue(instance)
select new XElement(name, value)
).ToList(); //Another Option is List<T>.AddRange()
return fieldElements;
}
另外:不要忘记,List<T>
已经实现.ForEach<T>()
,所以用它对付任何Enumerable<T>
,这是所有你需要的代码
myEnumerable.ToList().ForEach( x => myAction(x) );
我不认为这是太硬或也许我失去了一些东西......
IEnumerable<XElement> FieldsToXElements(object instance)
{
return instance.GetType()
.GetFields(instance)
.Select( f => new XElement( f.Name,
f.GetValue(instance) ) );
}
如果你只是在看从你的LINQ语句中调用一个函数,那么你已经可以做到这一点,你可以打电话到一家让分配的功能。
var qry = from e in somelist
let errorcode = DoSomeProcessing(e)
select e;
不隶属于 StackOverflow