这是一个带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;
}
Run Code Online (Sandbox Code Playgroud)
有点难看.如果在LINQ中有一些运算符意味着"做某事"(例如Action
对LINQ语句中选择的每一个执行一个),它会看起来更好,更简洁:
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;
}
Run Code Online (Sandbox Code Playgroud)
我意识到这是主观的,只是我的意见.对于一个只有一行调用方法的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;
}
Run Code Online (Sandbox Code Playgroud)
与此:
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;
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 16
不,我不希望任何时候任何直接的语言支持(即在查询语法内).
听起来你的意思是神话般的ForEach
扩展方法; 尽管很容易添加,但Eric Lippert已多次评论无副作用功能代码Action<T>
与副作用之间的交叉.特别是,C#3.0/.NET 3.5表达式树在side-effecs上很糟糕(使得完整的lambda支持变得棘手).运行时端在.NET 4.0中要好得多,但目前尚不清楚它将在C#4.0中将其中的多少用于语言(lambda编译器).
您所需要的(代表版本)是:
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{ // note: omitted arg/null checks
foreach(T item in source) { action(item); }
}
Run Code Online (Sandbox Code Playgroud)
然后从任何查询,您可以简单地使用.ForEach(x => /* do something */)
.
归档时间: |
|
查看次数: |
6807 次 |
最近记录: |