Member 8478234 Ответов: 1

Как извлечь текст из предложения на основе кодирования


Пожалуйста, найдите ниже более подробную информацию.

У меня есть текст со мной "" 1200005 # 28102016_0612 Inv. ACHExtractDetail POC.DiscountDetail Scanner Test1 " & amp; также список ключевых слов

keywords.Add(new KeywordCTIBO() { Keyword = "Scanner" });
          keywords.Add(new KeywordCTIBO() { Keyword = "Inv.ACHExtractDetail" });
          keywords.Add(new KeywordCTIBO() { Keyword = "POC.DiscountDetail" });


Что мне нужно, так это извлечь "Inv.ACHExtractDetail" из текста, так как он присутствует в списке. Я имею в виду первое вхождение ключевого слова из текста тогда и только тогда, когда оно существует в списке.

Ниже код работает нормально, но я смотрю гораздо лучше, если это возможно без использования циклов.

List<KeywordCTIBO> keywords = new List<KeywordCTIBO>();
           KeywordCTIBO matchedKeyword = null;
           keywords.Add(new KeywordCTIBO() { Keyword = "Scanner" });
           keywords.Add(new KeywordCTIBO() { Keyword = "Inv.ACHExtractDetail" });
           keywords.Add(new KeywordCTIBO() { Keyword = "POC.DiscountDetail" });

           string text = "1200005 # 28102016_0612 Inv.ACHExtractDetail POC.DiscountDetail Scanner Test1";
           //var matchedKeyWords = keywords.Where(f => text.ToLower().Split(',', ' ', ';').Contains(f.Keyword.ToLower())).Select(p => new { KeyWordBO = p, Index = text.ToLower().IndexOf(p.Keyword.ToLower()) });
           //string[] arr = text.ToLower().Split(',', ' ', ';');
           string [] arr = text.ToLower().Split(',', ' ', ';');
           string s = string.Empty;
           foreach(var r in arr){
               var matchedKeyWords = keywords.Where(f => r.Contains(f.Keyword.ToLower())).Select(p => new { KeyWordBO = p, Index = text.ToLower().IndexOf(p.Keyword.ToLower()) });
               foreach (var f in matchedKeyWords)
               {
                   s = f.KeyWordBO.Keyword;
               }
           }
       }
       public class KeywordCTIBO
       {
           public string Keyword { get; set; }
       }


Что я уже пробовал:

List<KeywordCTIBO> keywords = new List<KeywordCTIBO>();
            KeywordCTIBO matchedKeyword = null;
            keywords.Add(new KeywordCTIBO() { Keyword = "Scanner" });
            keywords.Add(new KeywordCTIBO() { Keyword = "Inv.ACHExtractDetail" });
            keywords.Add(new KeywordCTIBO() { Keyword = "POC.DiscountDetail" });
          
            string text = "1200005 # 28102016_0612 Inv.ACHExtractDetail POC.DiscountDetail Scanner Test1";
            //var matchedKeyWords = keywords.Where(f => text.ToLower().Split(',', ' ', ';').Contains(f.Keyword.ToLower())).Select(p => new { KeyWordBO = p, Index = text.ToLower().IndexOf(p.Keyword.ToLower()) });
            //string[] arr = text.ToLower().Split(',', ' ', ';');
            string [] arr = text.ToLower().Split(',', ' ', ';');
            string s = string.Empty;
            foreach(var r in arr){
                var matchedKeyWords = keywords.Where(f => r.Contains(f.Keyword.ToLower())).Select(p => new { KeyWordBO = p, Index = text.ToLower().IndexOf(p.Keyword.ToLower()) });
                foreach (var f in matchedKeyWords)
                {
                    s = f.KeyWordBO.Keyword;
                }
            }
        }
        public class KeywordCTIBO
        {
            public string Keyword { get; set; }
        }
        }

1 Ответов

Рейтинг:
2

Midi_Mick

Ваши концепции / методы хороши. Если вы просто хотите оптимизации, я бы посмотрел на следующие моменты:


  • r.Contains(.. в вашем Linq-это обязательно? Ты думал arr.Contains? Если да, то, может быть, стоит поставить arr в HashSet, и использование нечувствительного к регистру компаратора, а не преобразование всего в ToLower на каждой итерации.
  • Кратко упомянуто выше - вы конвертируете все ToLower() на каждой итерации. Либо преобразуйте вещи в нижний регистр до оператор Linq или используйте компараторы без учета регистра.