Пример #1
0
        public Dictionary <string, string> GetListByStr(string str)
        {
            Dictionary <string, string> dic = new();
            List <Idiom> items;
            bool         queryPrevDailyIdioms    = false;//查询往日成语
            Dictionary <string, List <long> > kv = new();

            //if (str == "我全都要")
            //{
            //    items = _idioms.Find(new BsonDocument()).Sort(Builders<Idiom>.Sort.Ascending("Name")).ToList();
            //}
            if (str == "试试手气")
            {
                items = _idioms.Aggregate().AppendStage <Idiom>("{$sample:{size:5}}").ToList();
            }
            else if (str == "有待订正")
            {
                items = _idioms.Find(x => x.ToBeCorrected == true).ToList();
            }
            else if (str.StartsWith("标签:"))
            {
                items = _idioms.Find(x => x.Tags.Contains(str.Replace("标签:", ""))).ToList();
            }
            else if (str == "往日成语")
            {
                //除去deft
                List <LaunchInfo> info = _launchInfo.Find(Builders <LaunchInfo> .Filter.Ne("DateUT", DateTimeOffset.MinValue.ToUnixTimeSeconds())).Sort(Builders <LaunchInfo> .Sort.Ascending("DateUT")).ToList();
                items = new List <Idiom>();
                queryPrevDailyIdioms = true;
                if (info.Count > 1)
                {
                    foreach (LaunchInfo itemInfo in info)
                    {
                        if (itemInfo.DailyIdiom != null)
                        {
                            if (!kv.ContainsKey(itemInfo.DailyIdiom.Id + "_" + itemInfo.DailyIdiom.Name))
                            {
                                kv.Add(itemInfo.DailyIdiom.Id + "_" + itemInfo.DailyIdiom.Name, new List <long> {
                                    itemInfo.DateUT
                                });
                            }
                            else
                            {
                                kv[itemInfo.DailyIdiom.Id + "_" + itemInfo.DailyIdiom.Name].Add(itemInfo.DateUT);
                            }
                        }
                    }
                }
            }
            else
            {
                items = _idioms.Find(Builders <Idiom> .Filter.Regex("Name", new BsonRegularExpression(str))).Sort(Builders <Idiom> .Sort.Ascending("Name")).ToList();
            }
            if (queryPrevDailyIdioms)
            {
                foreach (var it in kv)
                {
                    StringBuilder sb = new();
                    foreach (long i in it.Value)
                    {
                        DateTimeOffset time = DateTimeOffset.FromUnixTimeSeconds(i);
                        sb.Append(string.Format("{0:D}", time.ToLocalTime()) + "、");
                    }
                    sb.Remove(sb.Length - 1, 1);
                    string[] strArr = it.Key.Split("_");
                    dic.Add(strArr[0], sb + ":" + strArr[1]);
                }
            }
            else
            {
                if (items.Count == 0 && str != "试试手气" && str != "有待订正" && !str.StartsWith("标签:") && str != "往日成语")
                {
                    AutoCollect(str);
                    ProjectionDefinition <Idiom> definition = Builders <Idiom> .Projection.Include(doc => doc.Name);

                    Dictionary <string, int> res = LevenshteinDistance.Extract(str, _idioms.Find(new BsonDocument()).ToList().Select(x => x.Name).ToList(), 5);
                    foreach (var item in res)
                    {
                        Idiom tmp = _idioms.Find(x => x.Name == item.Key).FirstOrDefault();
                        dic.Add(tmp.Id, tmp.Name);
                    }
                }
                foreach (Idiom item in items)
                {
                    dic.Add(item.Id, item.Name);
                }
            }
            if (dic.Count == 0)
            {
                //rtn = new StandardReturn(20001);
                throw new EasyException(20001);
            }
            else
            {
                return(dic);
            }
        }