/* Fast sort, which works off data, rather than visual elements. * Since only 7 visual elements are allocated, this is required. */ public List <ListElementController_BASE_NotListView> Sort(List <ListElementController_BASE_NotListView> items) { LogSpam($"Sorting: {items.Select(item => GetRef(item).ComponentDefID).ToArray().Dump(false)}"); var sw = Stopwatch.StartNew(); var _a = new ListElementController_InventoryGear_NotListView(); var _b = new ListElementController_InventoryGear_NotListView(); var go = new UnityEngine.GameObject(); var _ac = go.AddComponent <InventoryItemElement_NotListView>(); //new InventoryItemElement_NotListView(); var go2 = new UnityEngine.GameObject(); var _bc = go2.AddComponent <InventoryItemElement_NotListView>(); _ac.controller = _a; _bc.controller = _b; var _cs = new Traverse(inventoryWidget).Field("currentSort").GetValue <Comparison <InventoryItemElement_NotListView> >(); var cst = _cs.Method; LogDebug(string.Format("Sort using {0}::{1}", cst.DeclaringType.FullName, cst.ToString())); var tmp = items.ToList(); tmp.Sort(new Comparison <ListElementController_BASE_NotListView>((l, r) => { _ac.ComponentRef = _a.componentRef = GetRef(l); _bc.ComponentRef = _b.componentRef = GetRef(r); _ac.controller = l; _bc.controller = r; _ac.controller.ItemWidget = _ac; _bc.controller.ItemWidget = _bc; _ac.ItemType = ToDraggableType(l.componentDef); _bc.ItemType = ToDraggableType(r.componentDef); var res = _cs.Invoke(_ac, _bc); LogSpam($"Compare {_a.componentRef.ComponentDefID}({_ac != null},{_ac.controller.ItemWidget != null}) & {_b.componentRef.ComponentDefID}({_bc != null},{_bc.controller.ItemWidget != null}) -> {res}"); return(res); })); UnityEngine.GameObject.Destroy(go); UnityEngine.GameObject.Destroy(go2); var delta = sw.Elapsed.TotalMilliseconds; LogInfo(string.Format("Sorted in {0} ms", delta)); LogSpam($"Sorted: {tmp.Select(item => GetRef(item).ComponentDefID).ToArray().Dump(false)}"); return(tmp); }