Optimize StartsWithPrefix

-Remove double "equality" test in StartsWithPrefix
-Further StartsWithPrefix efficiencies
-Remove subkey allocation in StartsWithPrefix
This commit is contained in:
Ben Adams 2016-02-10 00:15:49 +00:00 committed by Ryan Nowak
parent dacebacb90
commit 6c2c777bdc
1 changed files with 18 additions and 21 deletions

View File

@ -681,55 +681,52 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding
throw new ArgumentNullException(nameof(key)); throw new ArgumentNullException(nameof(key));
} }
if (StringComparer.OrdinalIgnoreCase.Equals(key, prefix))
{
return true;
}
if (key.Length <= prefix.Length)
{
return false;
}
if (!key.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
{
if (key.StartsWith("[", StringComparison.OrdinalIgnoreCase))
{
var subKey = key.Substring(key.IndexOf('.') + 1);
if (!subKey.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
{
return false;
}
if (string.Equals(prefix, subKey, StringComparison.OrdinalIgnoreCase))
{
return true;
}
key = subKey;
}
else
{
return false;
}
}
// Everything is prefixed by the empty string
if (prefix.Length == 0) if (prefix.Length == 0)
{ {
// Everything is prefixed by the empty string
return true; return true;
} }
if (key.Length < prefix.Length)
{
return false;
}
var subKeyIndex = 0;
if (!key.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
{
if (key[0] == '[')
{
subKeyIndex = key.IndexOf('.') + 1;
if (string.Compare(key, subKeyIndex, prefix, 0, prefix.Length, StringComparison.OrdinalIgnoreCase) != 0)
{
return false;
}
else if (prefix.Length == (key.Length - subKeyIndex))
{
// prefix == subKey
return true;
}
}
else else
{ {
var charAfterPrefix = key[prefix.Length]; return false;
}
}
else if (key.Length == prefix.Length)
{
// key == prefix
return true;
}
var charAfterPrefix = key[subKeyIndex + prefix.Length];
switch (charAfterPrefix) switch (charAfterPrefix)
{ {
case '[': case '[':
case '.': case '.':
return true; return true;
} }
}
return false; return false;
} }