O C# 4.0 trouxe alguns novos recursos ao LINQ, um deles é o operador Zip. Com esse operador nós podemos somar duas coleções. Vou mostrar alguns exemplos para você entender melhor.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
   
namespace ConsoleApplication1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
   
            int[] numeros = { 3, 5, 7 };  
            string[] palavras = { "três", 
				"cinco", 
				"sete", 
				"onze", 
				"treze" };  
   
            IEnumerable<int> concatenado = numeros.Zip(palavras, 
				(primeiro, segundo) => 
				primeiro + " = " + segundo);  
   
            //  
            // Imprime:  
            //  
            //      3 = três  
            //      5 = cinco  
            //      7 = sete  
            //  
            foreach (var item in concatenado)  
            {  
                Console.WriteLine(item);  
            } 

            int[] lista1 = { 3, 7, 11, 14 };  
            int[] lista2 = { 5, 8, 11, 12 };   

            IEnumerable<int> somado = lista1.Zip(lista2, 
				(primeiro, segundo) => primeiro + segundo);     

            //  
            // Imprime:  
            //  
            //      8  
            //      15  
            //      22  
            //      26  
            //   
            foreach (var item in somado)  
            {  
                Console.WriteLine(item);  
            }     

            Console.Read();  
        }  
    }  
} 

No primeiro exemplo nós concatenamos as duas strings para cada elemento da lista. E cada novo elemento tem o formato "{0} = {1}".

Já no segundo exemplo nós literalmente somamos duas coleções de inteiros. E obtemos uma lista onde o novo elemento representa a soma dos respectivos elementos das listas 1 e 2.

Observe que os elementos que não tiverem uma correspondência na lista 1 serão ignorados.