【问题标题】:Recursive linq and this?递归linq和这个?
【发布时间】:2014-01-31 21:59:28
【问题描述】:

我想通过扩展方法找到所有左撇子使用递归linq的人。

我看过这个answer,但this 存在问题(恕我直言):(由于静态上下文而作为扩展方法应用时)

关键字 this 在静态方法中无效

所以这是我尝试过的:

我有一个Person 课程:

public class Person
{
        public  List<Person> Children = new List<Person>();
        public bool IsLeftHanded;
}

这里是externsion方法的代码:

public static class Extensions
{   
        public static IEnumerable<Person> DescendantsAndSelf(this IEnumerable<Person> list)
        {
         yield return this;
        foreach (var item in list.SelectMany(x => x.Children.DescendantsAndSelf()))
        {
            yield return item;
        }
    }
}

但是yield return this;有问题

问题:

我如何fix 我的代码来支持“我和我的孩子”把戏? (目标:找到所有左撇子)

nb

请注意,我想使用 linq 和递归,以便体验使用递归的 linq。

【问题讨论】:

  • this 在静态类中不起作用。你应该传递一个 Person 类。
  • @JeroenvanLangen 是的,正如你所看到的,我已经写过它由于静态上下文而无法工作。好吧,我认为 wudzik 的解决方案非常合适。谢谢
  • 你传递一个IEnumerable&lt;Person&gt;,你应该传递“根”人。 (就像 wudzik 所做的那样 +1)
  • @RoyiNamir 对您有帮助吗?您需要更好的答案吗?

标签: c# linq .net-4.0


【解决方案1】:

我宁愿看到它像这样工作:

public static IEnumerable<Person> DescendantsAndSelf(this Person person)
{
    yield return person;
    foreach (var item in person.Children.SelectMany(x => x.DescendantsAndSelf()))
    {
        yield return item;
    }
}

然后对人而不是孩子运行它,像这样:

var person = new Person();
... do stuff
var desc = person.DescendantsAndSelf();

如果我看错了,请纠正我。

【讨论】:

  • 愚蠢的问题,但是使用“收益回报”(而不是建立一个列表并返回它)只是为了获得延迟执行的好处,还是有其他原因?跨度>
  • @vargonian 延迟执行是原因,阅读此线程:stackoverflow.com/questions/14057788/…
  • 非常感谢,这正是我所需要的。
【解决方案2】:

这是一个更通用的版本,适用于任何集合。

public static IEnumerable<T> SelectDescendents<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
{
        foreach(var item in source)
        {
            yield return item;
            foreach(T item2 in SelectDescendents(selector(item), selector))
                yield return item2;
        }
}

用法

Persons.SelectDescendents(p => p.Children);

【讨论】:

  • 这将如何返回人本身?请看我的结构
  • @RoyiNamir 在你的情况下,因为你没有人的集合,它会是:new[]{ Person }.SelectDescendents(p =&gt; p. Children)
猜你喜欢
  • 2018-07-05
  • 1970-01-01
  • 2012-01-29
  • 2011-06-16
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多