private static bool Match(string query, string haystack, bool strictOnly, float strictWeight, float looseWeight, out float score, bool[] indices) { score = 0; var isStreaking = false; var haystackIndex = 0; var matchedAny = false; for (var queryIndex = 0; queryIndex < query.Length; queryIndex++) { var queryCharacter = query[queryIndex]; if (StringUtility.IsWordDelimiter(queryCharacter)) { continue; } var matched = false; for (; haystackIndex < haystack.Length; haystackIndex++) { var haystackCharacter = haystack[haystackIndex]; if (StringUtility.IsWordDelimiter(haystackCharacter)) { isStreaking = false; continue; } var matchesLoose = Compare(queryCharacter, haystackCharacter); var matchesStrict = matchesLoose && (isStreaking || StringUtility.IsWordBeginning(haystack, haystackIndex)); var matches = strictOnly ? matchesStrict : matchesLoose; if (matches) { score += matchesStrict ? strictWeight : looseWeight; matched = true; if (indices != null) { indices[haystackIndex] = true; } isStreaking = true; haystackIndex++; break; } else { isStreaking = false; } } if (matched) { matchedAny = true; } else { return(false); } } if (!matchedAny) { return(false); } score /= query.Length; return(true); }