当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《任何"做"/ActionLINQ运营商的计划?》经验,为你挑选了1个好方法。

这是一个带foreach循环的简单方法:

IEnumerable FieldsToXElements(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语句中选择的每一个执行一个),它会看起来更好,更简洁:

IEnumerable FieldsToXElements(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运算符真正使代码看起来更清晰.这个:

IEnumerable FieldsToXElements
    (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;
}

与此:

IEnumerable FieldsToXElements
    (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 */).



1> Marc Gravell..:

不,我不希望任何时候任何直接的语言支持(即在查询语法内).

听起来你的意思是神话般的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 */).

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有