public Mag_Nametable(Stream stream1, Stream stream2) { // Если стримы пустые, то создаются последовательности с нулем элементов, если непустые, то происходит подключение ids = new UniversalSequence <int>(new PType(PTypeEnumeration.sstring), stream1); offs = new UniversalSequence <int>(new PType(PTypeEnumeration.longinteger), stream2); int nom = 0; ids.Scan((off, ob) => { dic.Add((string)ob, nom); nom++; return(true); }); }
public void CalculateStaticIndex() { if (dic1 != null) { dic1 = new Dictionary <int, long>(); // Не используем накопленное содержание } if (dic2 != null) { dic2 = new Dictionary <int, long>(); } int ind = 0; int nelements = (int)keyvalue_seq.Count(); keys_arr = new int[nelements]; long[] offs_arr = new long[nelements]; keyvalue_seq.Scan((off, obj) => { int key = (int)((object[])obj)[0]; keys_arr[ind] = key; offs_arr[ind] = off; ind++; return(true); }); Array.Sort(keys_arr, offs_arr); keys.Clear(); //keys.Fill(new object[0]); List <int> keys_list = new List <int>(); offsets.Clear(); //offsets.Fill(new object[0]); // Будем убирать повторы int prev_key = Int32.MaxValue; long prev_offset = Int64.MinValue; for (int i = 0; i < nelements; i++) { int key = keys_arr[i]; long offset = offs_arr[i]; if (key != prev_key) { // Надо сохранить пару, но только если предыдущий ключ не фиктивный if (prev_key != Int32.MaxValue) { keys.AppendElement(prev_key); keys_list.Add(prev_key); offsets.AppendElement(prev_offset); } prev_key = key; prev_offset = offset; } else { if (offset > prev_offset) { prev_offset = offset; } } } if (nelements > 0) { keys.AppendElement(prev_key); keys_list.Add(prev_key); offsets.AppendElement(prev_offset); } // Доделаем массив ключей keys_arr = keys_list.ToArray(); keys.Flush(); offsets.Flush(); // Внешние индексы, если есть if (exindexes != null) { foreach (var exindx in exindexes) { //var q = exindx.exkeys; //// long[] offs_arr = new long[nelements]; //int[] ext_arr = exindx.exkeys.ElementValues().Cast<int>().ToArray(); //int[] pri_arr = exindx.prikeys.ElementValues().Cast<int>().ToArray(); //Array.Sort(ext_arr, pri_arr); //exindx.exkeys.Clear(); //exindx.exkeys.Fill(new object[0]); //foreach (int k in ext_arr) exindx.exkeys.AppendElement(k); //exindx.prikeys.Clear(); //exindx.prikeys.Fill(new object[0]); //foreach (int k in pri_arr) exindx.prikeys.AppendElement(k); //exindx.exkeys.Flush(); //exindx.prikeys.Flush(); long ne = exindx.exprikeys.Count(); int[] ext_arr = new int[ne]; int[] pri_arr = new int[ne]; for (int i = 0; i < ne; i++) { object[] ep = (object[])exindx.exprikeys.GetElement(exindx.exprikeys.ElementOffset(i)); ext_arr[i] = (int)ep[0]; pri_arr[i] = (int)ep[1]; } Array.Sort(ext_arr, pri_arr); exindx.exprikeys.Clear(); for (int i = 0; i < ne; i++) { exindx.exprikeys.AppendElement(new object[] { ext_arr[i], pri_arr[i] }); } exindx.exprikeys.Flush(); pri_arr = null; exindx.key_arr = ext_arr; } } }