public static void Main(string[] args) { SortArrayList list = new SortArrayList(new StringComparer()); list.Add("d"); list.Add("A"); list.Add("C"); list.Add("c"); list.Add("b"); list.Add("B"); list.Add("D"); list.Add("a"); list.QuickSort(); foreach (string s in list) { Console.WriteLine(s); } }
private void LoadKey(string tablename, BigEntityTableMeta meta) { string indexfile = GetKeyFile(tablename); var indexmergeinfo = meta.IndexMergeInfos.Find(p => p.IndexName.Equals(meta.KeyName)); if (indexmergeinfo == null) { indexmergeinfo = new IndexMergeInfo(); indexmergeinfo.IndexName = meta.KeyName; meta.IndexMergeInfos.Add(indexmergeinfo); } //计算加载因子 indexmergeinfo.LoadFactor = (int)Math.Max(4, new FileInfo(indexfile).Length / MAX_KEYBUFFER); int i = 0; BigEntityTableIndexItem lastreadindex = null; List <BigEntityTableIndexItem> list = new List <BigEntityTableIndexItem>(); long currentpos = 0; long currrankindex = 0; byte[] buffer = new byte[1024 * 1024 * 10]; using (ObjTextReader idx = ObjTextReader.CreateReader(indexfile)) { Console.WriteLine("loadkey"); foreach (var newindex in idx.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer)) { if (newindex.Del) { continue; } newindex.KeyOffset = currentpos; newindex.RangeIndex = currrankindex++; newindex.SetIndex(meta.KeyIndexInfo); if (newindex.KeyOffset >= indexmergeinfo.IndexMergePos) { //list.Add(newindex); if (list.Count > 0) { if (list.Last().KeyOffset != lastreadindex.KeyOffset) { list.Add(lastreadindex); } } break; } if (indexmergeinfo.LoadFactor == 1 || i % indexmergeinfo.LoadFactor == 0) { list.Add(newindex); } i++; lastreadindex = newindex; } if (list.Count > 0 && list.Last().KeyOffset != lastreadindex.KeyOffset) { list.Add(lastreadindex); } } indexmergeinfo.TotalCount = i; BigEntityTableIndexItem[] oldindexitems = null; keyindexdisklist.TryRemove(tablename, out oldindexitems); keyindexdisklist.TryAdd(tablename, list.ToArray()); using (ObjTextReader idr = ObjTextReader.CreateReader(indexfile)) { Console.WriteLine("loadkey2"); if (indexmergeinfo.IndexMergePos > 0) { idr.SetPostion(indexmergeinfo.IndexMergePos); } //Dictionary<string, BigEntityTableIndexItem> indexdic = new Dictionary<string, BigEntityTableIndexItem>(); //keyindexlistdic[tablename]; SortArrayList <BigEntityTableIndexItem> keymemlist = new SortArrayList <BigEntityTableIndexItem>(); foreach (var newindex in idr.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer)) { newindex.KeyOffset = currentpos; newindex.SetIndex(meta.KeyIndexInfo); newindex.RangeIndex = -1; if (!newindex.Del) { //indexdic.Add(newindex.Key, newindex); keymemlist.Add(newindex); i++; } } var tablelocker = GetKeyLocker(tablename, string.Empty); tablelocker.EnterWriteLock(); try { foreach (var newindex in idr.ReadObjectsWating <BigEntityTableIndexItem>(1, p => currentpos = p, buffer)) { newindex.KeyOffset = currentpos; newindex.SetIndex(meta.KeyIndexInfo); newindex.RangeIndex = -1; if (!newindex.Del) { //indexdic.Add(newindex.Key, newindex); keymemlist.Add(newindex); i++; } } if (idr.Length() - currentpos > 10240) { throw new Exception(tablename + "主键索引大量数据未读取"); } //keyindexlistdic[tablename] = indexdic; keyindexmemlist[tablename] = keymemlist; } finally { tablelocker.ExitWriteLock(); } } }
private void TestFind() { List <string> list = new List <string>(); var first = Guid.NewGuid().ToString("N"); for (int i = 0; i < 2000000; i++) { list.Add(Guid.NewGuid().ToString("N")); //list.Add(first+i); } Console.WriteLine("开始排序112"); DateTime now = DateTime.Now; SortArrayList <string> sl = new SortArrayList <string>(); int j = 0; foreach (var ite in list) { try { sl.Add(ite); j++; } catch (Exception ce) { Console.WriteLine(ce.ToString()); } } var ms = DateTime.Now.Subtract(now).TotalMilliseconds; var orderlist = sl.GetList().ToList(); Console.WriteLine("排序完成,用时:" + ms + "ms," + orderlist.Count()); list.Add(Guid.NewGuid().ToString()); Console.WriteLine("测试查找"); now = DateTime.Now; int fund = 0; foreach (var item in list) { try { var s = sl.Find(item); if (s == null) { Console.WriteLine("查找失败:" + item); } else { fund++; } } catch (Exception ex) { Console.WriteLine("查找出错:" + item + ":" + ex.ToString()); break; } } Console.WriteLine("查找完成,查找到:" + fund + "个,用时:" + DateTime.Now.Subtract(now).TotalMilliseconds + "ms"); }
public static void TestString() { List <string> list = new List <string>(); var first = Guid.NewGuid().ToString("N"); for (int i = 0; i < 2000000; i++) { list.Add(Guid.NewGuid().ToString("N")); //list.Add(first+i); } Console.WriteLine("开始排序112"); DateTime now = DateTime.Now; SortArrayList <string> sl = new SortArrayList <string>(); int j = 0; foreach (var ite in list) { try { sl.Add(ite); j++; } catch (Exception ce) { Console.WriteLine(ce.ToString()); } } var ms = DateTime.Now.Subtract(now).TotalMilliseconds; var orderlist = sl.GetList().ToList(); Console.WriteLine("排序完成,用时:" + ms + "ms," + orderlist.Count()); now = DateTime.Now; list.Sort(); Console.WriteLine("原生排序完成:" + DateTime.Now.Subtract(now).TotalMilliseconds + "ms"); bool issame = true; if (list.Count() == orderlist.Count()) { int i = 0; foreach (var item in list) { if (item != orderlist[i++]) { issame = false; Console.WriteLine("不同:" + i); break; } } } else { issame = false; } if (issame) { Console.WriteLine("排序相同"); } else { Console.WriteLine("排序不同"); } }