这是一个带foreach
循环的简单方法:
IEnumerableFieldsToXElements(object instance) { var fieldElements = new List (); foreach (var field in instance.GetType().GetFields(instance)) { fieldElements.Add(new XElement(field.Name, field.GetValue(instance))); } return fieldElements; }
有点难看.如果在LINQ中有一些运算符意味着"做某事"(例如Action
对LINQ语句中选择的每一个执行一个),它会看起来更好,更简洁:
IEnumerableFieldsToXElements(object instance) { var fieldElements = new List (); 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
运算符真正使代码看起来更清晰.这个:
IEnumerableFieldsToXElements (object instance, Func predicate) { var fieldElements = new List (); foreach (var field in instance.GetType().GetFields(instance).Where(predicate)) { fieldElements.Add(new XElement(field.Name, field.GetValue(instance))); } return fieldElements; }
与此:
IEnumerableFieldsToXElements (object instance, Func predicate) { var fieldElements = new List (); 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; }
Marc Gravell.. 16
不,我不希望任何时候任何直接的语言支持(即在查询语法内).
听起来你的意思是神话般的ForEach
扩展方法; 尽管很容易添加,但Eric Lippert已多次评论无副作用功能代码Action
与副作用之间的交叉.特别是,C#3.0/.NET 3.5表达式树在side-effecs上很糟糕(使得完整的lambda支持变得棘手).运行时端在.NET 4.0中要好得多,但目前尚不清楚它将在C#4.0中将其中的多少用于语言(lambda编译器).
您所需要的(代表版本)是:
public static void ForEach(this IEnumerable source, Action action) { // note: omitted arg/null checks foreach(T item in source) { action(item); } }
然后从任何查询,您可以简单地使用.ForEach(x => /* do something */)
.
不,我不希望任何时候任何直接的语言支持(即在查询语法内).
听起来你的意思是神话般的ForEach
扩展方法; 尽管很容易添加,但Eric Lippert已多次评论无副作用功能代码Action
与副作用之间的交叉.特别是,C#3.0/.NET 3.5表达式树在side-effecs上很糟糕(使得完整的lambda支持变得棘手).运行时端在.NET 4.0中要好得多,但目前尚不清楚它将在C#4.0中将其中的多少用于语言(lambda编译器).
您所需要的(代表版本)是:
public static void ForEach(this IEnumerable source, Action action) { // note: omitted arg/null checks foreach(T item in source) { action(item); } }
然后从任何查询,您可以简单地使用.ForEach(x => /* do something */)
.