我可能可以自己写这篇文章,但是我试图实现这一目标的特定方式让我失望。我正在尝试编写一种与.NET 3.5中引入的通用扩展方法类似的通用扩展方法,该方法将嵌套IEnumerable的IEnumerable(等等)并将其展平为一个IEnumerable。有人有想法么?
具体来说,我在扩展方法本身的语法方面遇到麻烦,因此我无法使用展平算法。
最佳答案
嗯...我不确定您想要的是什么,但是这里有一个“一级”选项:
public static IEnumerable<TElement> Flatten<TElement,TSequence> (this IEnumerable<TSequence> sequences)
where TSequence : IEnumerable<TElement>
{
foreach (TSequence sequence in sequences)
{
foreach(TElement element in sequence)
{
yield return element;
}
}
}
如果这不是您想要的,您可以提供您想要的签名吗?如果您不需要通用形式,而只想做LINQ to XML构造函数那样的事情,那是相当简单的-尽管迭代器块的递归使用效率相对较低。就像是:
static IEnumerable Flatten(params object[] objects)
{
// Can't easily get varargs behaviour with IEnumerable
return Flatten((IEnumerable) objects);
}
static IEnumerable Flatten(IEnumerable enumerable)
{
foreach (object element in enumerable)
{
IEnumerable candidate = element as IEnumerable;
if (candidate != null)
{
foreach (object nested in candidate)
{
yield return nested;
}
}
else
{
yield return element;
}
}
}
请注意,这会将字符串视为一个字符序列-根据您的用例,您可能希望将特殊情况下的字符串作为单独的元素,而不是将它们展平。
有帮助吗?
关于c# - 递归列表展平,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/141467/