下面是一个简单的方法用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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top