C#等价的Python的itertools.chain

时间:2012-03-27 17:23:49

标签: c#

什么(如果有的话)是Python的itertools.chain方法的C#等价物?

Python示例:

l1 = [1, 2]
l2 = [3, 4]
for v in itertools.chain(l1, l2):
    print(v)

结果:
1
2
3
4

请注意,我对制作一个结合前两个然后处理它的新列表不感兴趣。我希望通过不实例化这个组合列表来节省itertools.chain提供的内存/时间。

3 个答案:

答案 0 :(得分:5)

您可以使用Concat中的LINQ扩展方法在C#上执行相同操作:

l1.Concat(l2)

LINQ使用延迟执行模型,因此不会创建新列表。

答案 1 :(得分:3)

Enumerable.ConcatMSDN

var l1 = new List<int>() { 1, 2 }; 
var l2 = new List<int>() { 3, 4 }; 

foreach(var item in Enumerable.Concat(l1, l2))
{
    Console.WriteLine(item.ToString()) 
}

答案 2 :(得分:0)

我已经开始构建自己的等效于itertools的C#。这是我想出的连锁店。简洁明了,并保留了一些Python的魅力。这是Chain的两个实现。看来编译器无法区分调用签名,因此请使用最适合您的签名。

    public static IEnumerable<T> Chain<T>(IEnumerable<IEnumerable<T>> collection)
    {
        foreach (var innerCollection in collection)
        {
            foreach (var item in innerCollection)
            {
                yield return item;
            }
        }
    }

    public static IEnumerable<T> Chain<T>(params IEnumerable<T>[] collection)
    {
        foreach (var innerCollection in collection)
        {
            foreach (var item in innerCollection)
            {
                yield return item;
            }
        }
    }