public static Admin.DictEntryRes processCommand(Admin.DictEntryCmd cmd) { Func<Langs, Langs, IEnumerable<ByHand>> getHands = (crsL, natL) => { var fn = Machines.rootPath + string.Format(@"RwDicts\Sources\LingeaOld\design\byHand_{0}_{1}.xml", crsL, natL); IEnumerable<string> fns = File.Exists(fn) ? XExtension.Create(fn) : Directory.EnumerateFiles(Machines.rootPath + @"RwDicts\Sources\LingeaOld\design", string.Format("byHand_{0}_{1}*.xml", crsL, natL)); return fns.SelectMany(f => XmlUtils.FileToObject<List<ByHand>>(f)); }; var hands = getHands(cmd.crsLang, cmd.natLang).ToDictionary(bh => bh.id(), bh => bh); var handFn = Machines.rootPath + string.Format(@"RwDicts\Sources\LingeaOld\design\byHand_{0}_{1}.xml", cmd.crsLang, cmd.natLang); ByHand edited; if (entries == null) entries = LingeaDictionary.getOldLingeaEntries(); if (dictEntries == null) dictEntries = XmlUtils.FileToObject<LingeaDictionary.DictEntry[]>(Machines.rootPath + @"RwDicts\Sources\LingeaOld\design\entriesInfo.xml"); switch (cmd.type) { case Admin.DictEntryCmdType.loadDict: Func<LingeaDictionary.DictEntry, Langs> getHand = de => hands.TryGetValue(de.id(), out edited) ? edited.okCrs : Langs.no; var res = dictEntries. //Where(de => cmd.crsLang == de.crsLang && cmd.natLang == de.natLang). Where(de => de.okCrs == Langs.no && cmd.crsLang == de.crsLang && cmd.natLang == de.natLang). Select(de => new DictEntryCmd { entryId = de.entryId, soundMaster = de.soundMaster, html = entries[de.crsLang][de.natLang].entryIdToEntry[de.entryId].ToString(), okCrs = getHand(de), }).ToArray(); //return new Admin.DictEntryRes { entries = res2.Length > 1000 ? res2.Where(de => de.okCrsMaybe == Langs.no).Take(1000).ToArray() : res2 }; return new Admin.DictEntryRes { entries = res }; case Admin.DictEntryCmdType.saveEntry: if (!hands.TryGetValue(cmd.id(), out edited)) { edited = new ByHand { entryId = cmd.entryId /*, crsLang = cmd.crsLang, natLang = cmd.natLang, okCrsReason = cmd.okCrsReason*/ }; hands.Add(edited.id(), edited); } edited.okCrs = cmd.okCrs; XmlUtils.ObjectToFile(handFn, hands.Values.ToList()); return new Admin.DictEntryRes(); case DictEntryCmdType.statistics: var files0 = dictEntries.Where(de => de.okCrs == Langs.no); var files1 = files0.GroupBy(de => new { de.crsLang, de.natLang }).Where(g => g.Count() > 0).Select(g => new { g.Key, count = g.Count() }); var files2 = files1. Select(g => new { g.Key, count = g.count }); var files3 = files2.Select(fc => new DictEntryCmd { allCount = fc.count, todoCount = fc.count - getHands(fc.Key.crsLang, fc.Key.natLang).Where(d => d.okCrs != Langs.no).Count(), crsLang = fc.Key.crsLang, natLang = fc.Key.natLang, }). ToArray(); return new Admin.DictEntryRes { entries = files3 }; default: throw new NotImplementedException(); } }