/// <summary> /// Sorts a list of items according to the execution order of each items /// associated <see cref="Component"/> type. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="items"></param> /// <param name="typeOfItem"></param> /// <param name="reverse"></param> public void SortTypedItems <T>(IList <T> items, Func <T, Type> typeOfItem, bool reverse) { T[] itemArray = items.ToArray(); IndexedTypeItem[] indexedTypes = new IndexedTypeItem[items.Count]; for (int i = 0; i < indexedTypes.Length; i++) { indexedTypes[i].Type = typeOfItem(itemArray[i]); indexedTypes[i].ItemIndex = i; indexedTypes[i].TypeIndex = this.GetSortIndex(indexedTypes[i].Type); } if (reverse) { Array.Sort(indexedTypes, (a, b) => b.TypeIndex - a.TypeIndex); } else { Array.Sort(indexedTypes, (a, b) => a.TypeIndex - b.TypeIndex); } for (int i = 0; i < indexedTypes.Length; i++) { items[i] = itemArray[indexedTypes[i].ItemIndex]; } }
/// <summary> /// Sorts a list of <see cref="Component"/> types according to their execution order. /// </summary> /// <param name="types"></param> /// <param name="reverse"></param> public void SortTypes(IList <Type> types, bool reverse) { IndexedTypeItem[] indexedTypes = new IndexedTypeItem[types.Count]; for (int i = 0; i < indexedTypes.Length; i++) { indexedTypes[i].Type = types[i]; indexedTypes[i].TypeIndex = this.GetSortIndex(indexedTypes[i].Type); } if (reverse) { Array.Sort(indexedTypes, (a, b) => b.TypeIndex - a.TypeIndex); } else { Array.Sort(indexedTypes, (a, b) => a.TypeIndex - b.TypeIndex); } for (int i = 0; i < indexedTypes.Length; i++) { types[i] = indexedTypes[i].Type; } }