我可能可以自己写这个代码,但是我尝试编写一个通用的扩展方法,类似于.NET 3.5中引入的其他扩展方法,它将获取一个嵌套的IEnumerable集合(等等)并将其展开为一个IEnumerable。有人有什么想法吗?
具体来说,我在扩展方法的语法上遇到了问题,以便我可以编写展平算法。
我可能可以自己写这个代码,但是我尝试编写一个通用的扩展方法,类似于.NET 3.5中引入的其他扩展方法,它将获取一个嵌套的IEnumerable集合(等等)并将其展开为一个IEnumerable。有人有什么想法吗?
具体来说,我在扩展方法的语法上遇到了问题,以便我可以编写展平算法。
class PageViewModel {
public IEnumerable<PageViewModel> ChildrenPages { get; set; }
}
Func<IEnumerable<PageViewModel>, IEnumerable<PageViewModel>> concatAll = null;
concatAll = list => list.SelectMany(l => l.ChildrenPages.Any() ?
concatAll(l.ChildrenPages).Union(new[] { l }) : new[] { l });
var allPages = concatAll(source).ToArray();
static class EnumerableExtensions
{
public static IEnumerable<T> Flatten<T>(this IEnumerable<IEnumerable<T>> sequence)
{
foreach(var child in sequence)
foreach(var item in child)
yield return item;
}
}
可能是这样吗?还是你的意思是它可能会无限地深入下去?
基本上,您需要在递归函数之外拥有一个主要的IENumerable,然后在递归函数中(伪代码)
private void flattenList(IEnumerable<T> list)
{
foreach (T item in list)
{
masterList.Add(item);
if (item.Count > 0)
{
this.flattenList(item);
}
}
}
虽然我不确定您所说的IEnumerable嵌套在IEnumerable中是什么意思...其中包含什么?有多少层嵌套?最终类型是什么?显然我的代码不正确,但我希望它能让您思考。