Mega Code Archive

 
Categories / C# / Collections Data Structure
 

Flatten a List

#region License // Copyright 2006 James Newton-King // http://www.newtonsoft.com // // This work is licensed under the Creative Commons Attribution 2.5 License // http://creativecommons.org/licenses/by/2.5/ // // You are free: //    * to copy, distribute, display, and perform the work //    * to make derivative works //    * to make commercial use of the work // // Under the following conditions: //    * You must attribute the work in the manner specified by the author or licensor: //          - If you find this component useful a link to http://www.newtonsoft.com would be appreciated. //    * For any reuse or distribution, you must make clear to others the license terms of this work. //    * Any of these conditions can be waived if you get permission from the copyright holder. #endregion using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace MySpace.Common.IO.JSON.Utilities {     internal static class CollectionUtils     {         public static List<List<T>> Flatten<T>(params IList<T>[] lists)         {             List<List<T>> flattened = new List<List<T>>();             Dictionary<int, T> currentList = new Dictionary<int, T>();             Recurse<T>(new List<IList<T>>(lists), 0, currentList, flattened);             return flattened;         }         private static void Recurse<T>(IList<IList<T>> global, int current, Dictionary<int, T> currentSet, List<List<T>> flattenedResult)         {             IList<T> currentArray = global[current];             for (int i = 0; i < currentArray.Count; i++)             {                 currentSet[current] = currentArray[i];                 if (current == global.Count - 1)                 {                     List<T> items = new List<T>();                     for (int k = 0; k < currentSet.Count; k++)                     {                         items.Add(currentSet[k]);                     }                     flattenedResult.Add(items);                 }                 else                 {                     Recurse(global, current + 1, currentSet, flattenedResult);                 }             }         }     } }