/// <summary> /// 以前のソート状態で再ソートする。 /// 実際にソートされるとTRUEが返る。 /// </summary> public bool SortByMultiHeader(IList itemList0) { if (IsExistSortParams == false) { return(false); } List <object> srcList = itemList0.OfType <object>().ToList(); if (srcList.Count <= 1) { return(false); } //リフレクション+毎回プロパティ読み出しがかなり重いので、キャッシュを使用する var gvCache1 = new gvCache(srcList); //前処理(キャッシュからDictionaryを排除するため) List <int> idxData = Enumerable.Range(0, srcList.Count).ToList(); string prevPath = ""; // Item1:first index, Item2: last index List <Tuple <int, int> > sortGroupList1 = null; for (int i1 = 0; i1 < this._multiHeaderSortDict.Count; i1++) { GridViewColumnHeader columnHeader1 = this._multiHeaderSortDict.ElementAt(i1).Key; ListSortDirection sortDirection1 = this._multiHeaderSortDict.ElementAt(i1).Value; string path = getHeaderString(columnHeader1); if (string.IsNullOrEmpty(path) == true) { continue; } sortGroupList1 = CreateSortedItemGroupList(prevPath, sortGroupList1, idxData, gvCache1); foreach (var kvp1 in sortGroupList1) { idxData.Sort( kvp1.Item1, kvp1.Item2 - kvp1.Item1 + 1, new ItemComparer(path, sortDirection1, gvCache1)); } prevPath = path; } //後処理 itemList0.Clear(); foreach (var idx in idxData) { itemList0.Add(srcList[idx]); } return(true); }
public ItemComparer(string sortBy0, ListSortDirection direction0, gvCache cache) { direction = direction0 == ListSortDirection.Descending ? -1 : 1; cache.GetCache(sortBy0, out this.values, out this.dvalues, out this.isnumeric, out this.keys); }
private List <Tuple <int, int> > CreateSortedItemGroupList(string prevPath , List <Tuple <int, int> > prevSortGroupList0, List <int> orderdIdxData, gvCache cache) { var sortGroupList1 = new List <Tuple <int, int> >(); if (prevSortGroupList0 == null) { // 最初 sortGroupList1.Add(new Tuple <int, int>(0, cache.ItemsCount - 1)); } else { IComparable[] values = cache.GetCache(prevPath); foreach (var kvp1 in prevSortGroupList0) { IComparable prevVal1 = null; int startIndex1 = kvp1.Item1; int i_First1 = kvp1.Item1; int i_Last1 = kvp1.Item2; for (int i1 = i_First1; i1 <= i_Last1; i1++) { IComparable val1 = values[orderdIdxData[i1]]; if (i1 != i_First1 && NullableEqualsTo(val1, prevVal1) == false) {// 値が変化 sortGroupList1.Add(new Tuple <int, int>(startIndex1, i1 - 1)); startIndex1 = i1; } prevVal1 = val1; if (i1 == i_Last1) {// last sortGroupList1.Add(new Tuple <int, int>(startIndex1, i1)); } } } } return(sortGroupList1); }