zoukankan      html  css  js  c++  java
  • C#4.0新特性之(四)新的LINQ扩展方法-Zip()

    1.简介

      所谓zip(中文有拉链的意思),就是像拉链一样,把两个list缝合在一起。Python中有个zip函数可以用来方便的合并两个或者多个集合,例如:

    >>> firstName=['Freesc','Joshua','Ken']
    >>> lastName=['Huang','Guan','Wang']
    >>> for f,l in zip(firstName,lastName):
        print('{0} {1}'.format(f,l))

     以上代码会打印出

    Freesc Huang
    Joshua Guan
    Ken Wang

    在C#4.0中,我们可以看到一个类似的扩展函数[1]

    复制代码
            //
            // Summary:
            //     Merges two sequences by using the specified predicate function.
            //
            // Parameters:
            //   first:
            //     The first sequence to merge.
            //
            //   second:
            //     The second sequence to merge.
            //
            //   resultSelector:
            //     A function that specifies how to merge the elements from the two sequences.
            //
            // Type parameters:
            //   TFirst:
            //     The type of the elements of the first input sequence.
            //
            //   TSecond:
            //     The type of the elements of the second input sequence.
            //
            //   TResult:
            //     The type of the elements of the result sequence.
            //
            // Returns:
            //     An System.Collections.Generic.IEnumerable<T> that contains merged elements
            //     of two input sequences.
            public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, 
                                               IEnumerable<TSecond> second, 
                                               Func<TFirst, TSecond, TResult> resultSelector);
    复制代码

    它可以用来合并列表,并且提供了自定义的组合规则:Func<TFirst, TSecond, TResult> resultSelector。

    2.示例

      下面是一段和代码1功能一样的C#4.0程序: 

    复制代码
                List<String> firstName = new List<String> { "Freesc", "Joshua", "Ken" };
                List<String> lastName = new List<String> { "Huang", "Guan", "Wang" };
                foreach (var name in firstName.Zip(lastName, (fname, lname) => fname + " " + lname))
                {
                    Console.WriteLine(name);
                }
    复制代码
     

    3.Zip()的实现

      在python中要实现一个zip,很简单(这里省去了异常处理),只需要用到三个内建函数,iter,map和next:

    复制代码
    def zip(*iterables):
        # zip('ABCD', 'xy') --> Ax By
        iterables = map(iter, iterables)
        while iterables:
            yield tuple(map(next, iterables))
     
    复制代码

    类似的,如果不考虑异常处理,C#的Zip扩展方法可以是如下实现[2]

    代码5

    4.总结

      Zip作为LINQ系统的新成员,提供了一种自由组合两个集合的方式,要注意的是,这个Zip使用时要求两个序列的长度一致,如果不一致,它会yield较短的长度。这一点和python中的zip是一样的。另外,您不妨可以试着写一个组合多个集合的MultiZip方法,也许它对您更加有用;-)

    5.引用

    [1] http://msdn.microsoft.com/en-us/library/dd267698(VS.100).aspx

    [2] http://community.bartdesmet.net/blogs/bart/archive/2008/11/03/c-4-0-feature-focus-part-3-intermezzo-linq-s-new-zip-operator.aspx

  • 相关阅读:
    86. Partition List
    328. Odd Even Linked List
    19. Remove Nth Node From End of List(移除倒数第N的结点, 快慢指针)
    24. Swap Nodes in Pairs
    2. Add Two Numbers(2个链表相加)
    92. Reverse Linked List II(链表部分反转)
    109. Convert Sorted List to Binary Search Tree
    138. Copy List with Random Pointer
    为Unity的新版ugui的Prefab生成预览图
    ArcEngine生成矩形缓冲区
  • 原文地址:https://www.cnblogs.com/deepalley/p/14125385.html
Copyright © 2011-2022 走看看