我可能可以自己写这篇文章,但是我试图实现这一目标的特定方式让我失望。我正在尝试编写一种与.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/

10-13 06:11