Ever wanted to interleave multiple sources of data? Well I did, so I wrote this, which interleaves multiple (generic) lists into a single.
public static List<telement> Interleave<telement>(params List<telement>[] pvParamLists) { // if nothing is provided we'll simply return an empty list if (pvParamLists == null) return new List<telement>(); int listCount = pvParamLists.Length; // offset map indicating current position in a given list int[] pointerMap = new int[listCount]; // count total elements int resultSize = 0; foreach(List<telement> list in pvParamLists) { if (list != null) { resultSize += list.Count; } } // create our result list List<telement> interleavedList = new List<telement>(resultSize); // will quit when finished while (interleavedList.Count < resultSize) { for (int x = 0; x < listCount; x++) { if (pointerMap[x] != -1) { List<telement> currentList = pvParamLists[x]; // skip null or empty lists if ((currentList == null) || (currentList.Count == 0) || (pointerMap[x] >= currentList.Count)) { pointerMap[x] = -1; continue; } interleavedList.Add(currentList[pointerMap[x]++]); } } } return interleavedList; }
The whole file, including some unit tests is here.