public virtual void LoadFromTxt(string path) { //if (Load(ByteArray.Create(path + Predefine.BIN_EXT))) return; var lines = File.ReadAllLines(path); // print lines[0]; // version // print lines[1]; // cost-factor // print lines[2]; // "maxid:xx" // print lines[3]; // xsize // lines[4]: blank line tag2id = new Dictionary <string, int>(); int i = 5; string line = null; for (; i < lines.Length; i++) { line = lines[i]; if (string.IsNullOrEmpty(line)) { break; } tag2id[line] = i - 5; } int size = tag2id.Count; id2tag = new string[size]; //! id2tag的元素赋值为什么不放入上一个循环中? tag2id.Count必然比keyvaluepair.value最大值大1,否则下面给id2tag元素赋值会出错 foreach (var p in tag2id) { id2tag[p.Value] = p.Key; } var ffMap = new SortedDictionary <string, FeatureFunction>(StrComparer.Default); var ffList = new List <FeatureFunction>(); _ftList = new List <FeatureTemplate>(); i++; // 跳过当前的空白行 for (; i < lines.Length; i++) { line = lines[i]; if (string.IsNullOrEmpty(line)) { break; } if ("B" != line) { _ftList.Add(FeatureTemplate.Create(line)); } else { _matrix = new double[size][]; //? 第一次遇到"B"行,表示接来下是_matrix数据信息,于是,初始化_matrix方阵 } } i++; // 跳过当前空白行 if (_matrix != null) { i++; // 如果提供了_matrix数据信息,则接下来一行为 0 B,跳过 } for (; i < lines.Length; i++) { line = lines[i]; if (string.IsNullOrEmpty(line)) { break; } var args = line.Split(new[] { ' ' }, 2); var chars = args[1].ToCharArray(); var ff = new FeatureFunction(chars, size); ffMap[args[1]] = ff; ffList.Add(ff); } i++; // 跳过当前空白行 if (_matrix != null) { for (int k = 0; k < size; k++) { _matrix[k] = new double[size]; for (int j = 0; j < size; j++) { _matrix[k][j] = double.Parse(lines[i++]); } } } for (int k = 0; k < ffList.Count; k++) { var ff = ffList[k]; for (int j = 0; j < size; j++) { ff.w[j] = double.Parse(lines[i++]); } } if (i < lines.Length) { // log "文本读取有残留,可能出现问题" } _ffTrie.Build(ffMap); // 缓存bin数据文件 var fs = new FileStream(path + Predefine.BIN_EXT, FileMode.Create, FileAccess.Write); try { Save(fs); fs.Close(); } catch (Exception e) { // log e fs.Close(); File.Delete(path + Predefine.BIN_EXT); } OnLoadTxtFinished(); }