public static (string sentence, string?highlighter) Highlight(this IMorphologicalAnalyzer <IpadicEntry> analyzer, string haystack, string needle) { var needleMorphemes = analyzer .ParseToEntries(needle) .Where(e => e.IsRegular) .ToList(); var haystackMorphemes = analyzer .ParseToEntries(haystack) .Where(e => e.IsRegular) .ToList(); if (haystackMorphemes.Count == 0 || needleMorphemes.Count == 0) { return(haystack, null); } var values = new List <int>(haystackMorphemes.Count); for (int i = 0; i < haystackMorphemes.Count; ++i) { var count = Enumerable .Zip(haystackMorphemes.Skip(i), needleMorphemes) .Count(pair => pair.First.DictionaryForm == pair.Second.DictionaryForm); values.Add(count); } var start = EnumerableExt.MaxBy(values.Indexed(), p => p.element).index; var highlighter = GetHighlighterFor(haystack); var haystackStrings = haystackMorphemes.Select(m => m.SurfaceForm).Materialize(); var strings = haystackStrings .Take(start) .Append(highlighter) .Concat(haystackStrings.Skip(start).Take(values[start])) .Append(highlighter) .Concat(haystackStrings.Skip(start + values[start])); return(string.Concat(strings), highlighter); }