【问题标题】:Linq extension to recursively retrieve collection of items用于递归检索项目集合的 Linq 扩展
【发布时间】:2012-08-25 19:32:11
【问题描述】:
public class MyClass
{
    public MyClass();

    public long Id { get; set; }
    public intScore { get; set; }
    public MyClass[] subclasses { get; set; }
    public string title { get; set; }
   .....    
 }

从外部源返回的结果是递归的,我正在尝试使用 linq 或任何使用递归的扩展方法从集合中检索结果,感谢任何帮助。

前;我的收藏是

Myclass results=XXXmethod(xxxx)// which gives me results.

subclasses 是一个Myclass 类型的列表,所以这个列表将再次包含一些集合,并且反过来可以收集一个嵌套级别

说服务返回了 10 个结果或 Myclass[10] Myclass[0] 再次出现 Myclass[4] 可能有 2 或 4 个,需要建立一个集合 allitems

我正在尝试这样做,但有些丢失了

results.class.subclusters.subclasses (o => o.subclasses )
               .SelectMany(x => x.subclasses ).ToList()

但没有给出正确的结果。

【问题讨论】:

标签: linq


【解决方案1】:

LINQ 本身不支持递归方法,但你可以有如下递归方法:

public class MyClass
{
    public int Id { get; set; }

    public MyClass[] SubClasses { get; set; }

    //More properties

    public IEnumerable<MyClass> GetRecursive()
    {
        yield return this;

        if (SubClasses != null)
        {
            foreach (var item in SubClasses
                          .Where(s => s != null)
                          .SelectMany(x => x.GetRecursive()))
            {
                yield return item;
            }
        }
    }
}

然后调用:

myClass.GetRecursive()

【讨论】:

  • 您可能想在其中添加一个空过滤器:SubClasses.Where(x => x != null).SelectMany(...)
  • 我正在尝试做一些类似的事情,但不确定 yield 在这里是如何工作的,其他的事情是没有结构..我将结果作为 myclass 的对象返回,只是想知道如何调用myclass.Getrecursive(),getrecursive 应该接受 mylist 并返回所有的孩子,对吗?任何帮助表示赞赏
  • @PraveenKonduru:“没有结构”和“作为 myclass 的对象返回的结果”是什么意思?
  • 我正在使用一项服务,该服务正在向我返回这些结果,并且结果属于类型。当然,您发送给我的结果结构的代码是相同的。另一件事是尝试您的代码 yield return this;这是什么?--谢谢
  • @PraveenKonduru:yield return this 是您获得结果的关键,您可能需要查看更多信息:msdn.microsoft.com/en-us/library/9k7k7cf0.aspx
猜你喜欢
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
相关资源
最近更新 更多