任何"做"/ Action LINQ运营商的计划?

cor*_*ore 12 c# linq c#-4.0

这是一个带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 */).