예제 #1
0
        /// <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);
        }
예제 #2
0
 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);
 }
예제 #3
0
        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);
        }