[C# 4.0] New Extension Method “Zip”

C# 2009. 4. 8. 16:10 Posted by 알 수 없는 사용자

참고 : http://blogs.msdn.com/wriju/archive/2009/02/28/c-4-0-new-extension-method-zip.aspx

저는 이 방법을 알기 전에 다음과 같은 방법을 사용 했었지요.

Web 서버에 Post 방식으로 요청을 보낼때 Query String을 사용하게 되었는데, 그 형식은 다음과 같았습니다. 
custom_action_id=1&id=330&resource_type=lot&uuid=b657895
parameter 값은 각각 Key 와  Value로 구성되어 있었습니다. 그래서 위와 같은 query string을 자동으로 계산하는 방법을 생각해 보게 되었는데요...

Select 를 이용해서 원하는 구문을 얻을 수 있었지요.  사실 linq에 익숙해지기 위해 만들어 보았을 뿐 복잡하게 할 필요는 없었습니다.

근데 C# 4.0 에서 소개된 Zip 메소드를 이용해서 다른 방법으로 바꿔 볼 수 있었습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] parms = { "custom_action_id", "id", "resource_type", "uuid" };
            string[] values = { "1", "330", "Lot", "b53c37ed8c1f8a8075961400b1b4606eb12fd81b"};

            Console.WriteLine(ZipExtentionMethodTest(parms, values));
            Console.ReadLine();
        }

        public static string ZipExtentionMethodTest(string[] paramerters, string[] values)
        {
            // parse dict
            string ptrs = null;

            var parmStr = paramerters.Zip( values, (paramerter, value) => new
            {    
                inplace = ( values[values.Length - 1] !=  value ?
                    paramerter + "=" + value + "&" : paramerter + "=" + value
                )
            });

            foreach (var item in parmStr)
            {
                ptrs += item.inplace;
            }

            return ptrs;
        }
    }
}

위 코드랑 비교해 본다면 전 코드의 경우 Object 배열 타입의 dict란 변수를 받아서,  select  구문으로 key 와 value 값을 결합하고 인덱스가 마지막일 경우 다른 조건의 결합 을 사용하게 되어 있습니다.

그런데 Zip 코드를 이용하면, 간단히 두개의 배열로 부터 인자를 받아 하나로 합칠 수 있지요. 하지만 인덱스를 사용할 수 없어서 조건은 배열의 길이를 이용하였습니다. 

Zip을 사용하면 두개의 배열에 있는 element 들을 하나로 합칠 때 사용하면 좋은 방법이 될 것 같네요.